Oracle Capabilities

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

Sort
Expand

Loads review data.

naftiko: "0.5"
info:
  label: "Access Review to Snowflake"
  description: "Loads review data."
  tags:
    - security
    - compliance
    - okta
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access
      port: 8080
      tools:
        - name: access-review-to-snowflake
          description: "Loads review data."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "okta.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Access Review to Snowflake"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://okta.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves EC2 instance state.

naftiko: "0.5"
info:
  label: "AWS EC2 Instance Status"
  description: "Retrieves EC2 instance state."
  tags:
    - cloud
    - infrastructure
    - aws
capability:
  exposes:
    - type: mcp
      namespace: cloud-infra
      port: 8080
      tools:
        - name: get-ec2
          description: "Given instance ID, return state."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "Instance Id"
          call: aws.describe-instance
          with:
            instance_id: "{{instance_id}}"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://ec2.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sigv4_token"
        placement: header
      resources:
        - name: instances
          path: "/"
          operations:
            - name: describe-instance
              method: GET

Creates FinOps ticket.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly to Jira"
  description: "Creates FinOps ticket."
  tags:
    - cloud
    - finops
    - azure
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-cost-anomaly-to-jira
          description: "Creates FinOps ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure Cost Anomaly to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Azure Cost Anomaly to Jira triggered"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://azure.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Azure cost for resource group.

naftiko: "0.5"
info:
  label: "Azure Cost Lookup"
  description: "Queries Azure cost for resource group."
  tags:
    - cloud
    - finops
    - azure
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: get-cost
          description: "Given subscription, return cost."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Subscription Id"
          call: azure-cost.get-cost
          with:
            subscription_id: "{{subscription_id}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-cost
              method: POST

Creates bug for failures.

naftiko: "0.5"
info:
  label: "Azure DevOps to Jira"
  description: "Creates bug for failures."
  tags:
    - devops
    - ci-cd
    - azure-devops
    - jira
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-devops-failure-to-jira
          description: "Creates bug for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure-devops.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure DevOps to Jira"
  consumes:
    - type: http
      namespace: azure-devops
      baseUri: "https://azure-devops.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Reminds unenrolled employees.

naftiko: "0.5"
info:
  label: "Benefits Enrollment Reminder"
  description: "Reminds unenrolled employees."
  tags:
    - hr
    - workday
    - servicenow
    - slack
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: benefits
      port: 8080
      tools:
        - name: benefits-enrollment-reminder
          description: "Reminds unenrolled employees."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Benefits Enrollment Reminder"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Benefits Enrollment Reminder triggered"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Applies on approval.

naftiko: "0.5"
info:
  label: "Change to Terraform Apply"
  description: "Applies on approval."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: change
      port: 8080
      tools:
        - name: change-to-terraform-apply
          description: "Applies on approval."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Change to Terraform Apply"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Blocks and alerts.

naftiko: "0.5"
info:
  label: "Cloudflare Block to PagerDuty"
  description: "Blocks and alerts."
  tags:
    - security
    - networking
    - cloudflare
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: cloudflare
      port: 8080
      tools:
        - name: cloudflare-block-to-pagerduty
          description: "Blocks and alerts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "cloudflare.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Cloudflare Block to PagerDuty"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://cloudflare.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Lists DNS records for zone.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Records"
  description: "Lists DNS records for zone."
  tags:
    - networking
    - dns
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: dns
      port: 8080
      tools:
        - name: list-records
          description: "Given zone ID, return records."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "Zone Id"
          call: cloudflare.list-records
          with:
            zone_id: "{{zone_id}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records"
          operations:
            - name: list-records
              method: GET

Creates incident for alarms.

naftiko: "0.5"
info:
  label: "CloudWatch to ServiceNow"
  description: "Creates incident for alarms."
  tags:
    - cloud
    - itsm
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cloudwatch
      port: 8080
      tools:
        - name: cloudwatch-alarm-to-incident
          description: "Creates incident for alarms."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "aws.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "CloudWatch to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "CloudWatch to ServiceNow triggered"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://aws.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Compares Terraform and CMDB.

naftiko: "0.5"
info:
  label: "CMDB Drift Detection"
  description: "Compares Terraform and CMDB."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
    - governance
capability:
  exposes:
    - type: mcp
      namespace: cmdb
      port: 8080
      tools:
        - name: cmdb-drift-detection
          description: "Compares Terraform and CMDB."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "CMDB Drift Detection"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Refreshes dashboard.

naftiko: "0.5"
info:
  label: "Compensation to Power BI"
  description: "Refreshes dashboard."
  tags:
    - hr
    - analytics
    - workday
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: comp
      port: 8080
      tools:
        - name: comp-review-to-power-bi
          description: "Refreshes dashboard."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Compensation to Power BI triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates compliance task.

naftiko: "0.5"
info:
  label: "Concur Expense Violation"
  description: "Creates compliance task."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: concur
      port: 8080
      tools:
        - name: concur-expense-violation
          description: "Creates compliance task."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "sap-concur.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Concur Expense Violation"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Concur Expense Violation triggered"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://sap-concur.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_concur_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Publishes a new technical knowledge base article to a Confluence space and notifies the relevant Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Publish"
  description: "Publishes a new technical knowledge base article to a Confluence space and notifies the relevant Microsoft Teams channel."
  tags:
    - communication
    - confluence
    - microsoft-teams
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: kb-publishing
      port: 8080
      tools:
        - name: publish-kb-article
          description: "Given a Confluence space key, parent page, title, and content, create a knowledge base article and notify the designated Teams channel. Use for publishing product documentation, runbooks, or support articles."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "The Confluence space key (e.g., 'DOCS')."
            - name: parent_page_id
              in: body
              type: string
              description: "Confluence parent page ID for the KB article."
            - name: title
              in: body
              type: string
              description: "Title of the knowledge base article."
            - name: content
              in: body
              type: string
              description: "Article content in Confluence storage format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID to notify of the new article."
          steps:
            - name: create-kb-article
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{space_key}}"
                parent_page_id: "{{parent_page_id}}"
                title: "{{title}}"
                content: "{{content}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "New KB article published: {{title}} — {{create-kb-article.webui_url}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Confluence page by title.

naftiko: "0.5"
info:
  label: "Confluence Page Search"
  description: "Retrieves Confluence page by title."
  tags:
    - knowledge
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given title, return page."
          inputParameters:
            - name: title
              in: body
              type: string
              description: "Title"
          call: confluence.get-page
          with:
            title: "{{title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://oracle-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: get-page
              method: GET

Enrolls expiring contracts.

naftiko: "0.5"
info:
  label: "Contract to HubSpot Nurture"
  description: "Enrolls expiring contracts."
  tags:
    - crm
    - marketing
    - salesforce
    - hubspot
    - slack
capability:
  exposes:
    - type: mcp
      namespace: contract
      port: 8080
      tools:
        - name: contract-to-hubspot-nurture
          description: "Enrolls expiring contracts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Contract to HubSpot Nurture triggered"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates Jira for failures.

naftiko: "0.5"
info:
  label: "Databricks Failure to Jira"
  description: "Creates Jira for failures."
  tags:
    - data
    - devops
    - azure-databricks
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: databricks
      port: 8080
      tools:
        - name: databricks-failure-to-jira
          description: "Creates Jira for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Databricks Failure to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Databricks Failure to Jira triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates PagerDuty incident and notifies Slack on critical.

naftiko: "0.5"
info:
  label: "Datadog Alert to PagerDuty and Slack"
  description: "Creates PagerDuty incident and notifies Slack on critical."
  tags:
    - observability
    - incident-response
    - datadog
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: datadog
      port: 8080
      tools:
        - name: datadog-alert-to-pagerduty-slack
          description: "Creates PagerDuty incident and notifies Slack on critical."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Datadog Alert to PagerDuty and Slack"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Datadog Alert to PagerDuty and Slack triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Datadog monitor fires a critical alert, automatically creates a PagerDuty incident for the on-call engineer and posts context to the ops Slack channel.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert to PagerDuty"
  description: "When a Datadog monitor fires a critical alert, automatically creates a PagerDuty incident for the on-call engineer and posts context to the ops Slack channel."
  tags:
    - observability
    - datadog
    - pagerduty
    - slack
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: alerting-ops
      port: 8080
      tools:
        - name: escalate-datadog-alert
          description: "Given a Datadog monitor ID and PagerDuty service ID, fetch alert details and create a PagerDuty incident, then post context to Slack. Use when a critical Datadog monitor fires for Oracle Cloud Infrastructure services."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired the critical alert."
            - name: pagerduty_service_id
              in: body
              type: string
              description: "The PagerDuty service ID for the on-call routing."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel to post alert context to."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-pd-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service_id}}"
                title: "Datadog Alert: {{get-monitor.name}}"
                incident_key: "dd-{{monitor_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Critical Alert: {{get-monitor.name}} | PagerDuty Incident: {{create-pd-incident.incident_number}} | State: {{get-monitor.overall_state}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves Datadog monitor status.

naftiko: "0.5"
info:
  label: "Datadog Monitor Lookup"
  description: "Retrieves Datadog monitor status."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor
          description: "Given monitor ID, return status."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor Id"
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          operations:
            - name: get-monitor
              method: GET

Queries Datadog for the current monitor status of a named Oracle Cloud service and returns the aggregate health state.

naftiko: "0.5"
info:
  label: "Datadog Service Health Dashboard Lookup"
  description: "Queries Datadog for the current monitor status of a named Oracle Cloud service and returns the aggregate health state."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cloud-health
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Datadog service name, return the current monitor states and total alert count. Use to check Oracle Cloud service health before deployments or executive briefings."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name to query (e.g., 'oci-compute-service')."
          call: "datadog.get-monitors"
          with:
            name: "{{service_name}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
            - name: alert_count
              type: number
              mapping: "$.total_count"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: name
              in: query
          operations:
            - name: get-monitors
              method: GET

Queries Datadog for SLO compliance data across Oracle Cloud services in the past 7 days and publishes a weekly reliability report to Confluence.

naftiko: "0.5"
info:
  label: "Datadog SLO Weekly Reliability Report"
  description: "Queries Datadog for SLO compliance data across Oracle Cloud services in the past 7 days and publishes a weekly reliability report to Confluence."
  tags:
    - observability
    - datadog
    - confluence
    - slo
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: reliability-ops
      port: 8080
      tools:
        - name: publish-weekly-slo-report
          description: "Fetch Datadog SLO compliance for Oracle Cloud services over the past 7 days and publish a weekly reliability report to Confluence. Use for engineering leadership reliability reviews."
          inputParameters:
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for the SLO report."
            - name: confluence_parent_id
              in: body
              type: string
              description: "Confluence parent page ID for the weekly report."
            - name: slo_query
              in: body
              type: string
              description: "Datadog SLO query filter string (e.g., 'service:oci-production')."
          steps:
            - name: get-slo-data
              type: call
              call: "datadog.list-slos"
              with:
                query: "{{slo_query}}"
            - name: publish-slo-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                parent_page_id: "{{confluence_parent_id}}"
                title: "Weekly SLO Reliability Report"
                content: "Oracle Cloud SLO compliance data from Datadog for the past 7 days. Total SLOs monitored: {{get-slo-data.total_count}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Creates task for vulnerabilities.

naftiko: "0.5"
info:
  label: "Dependabot to Jira Security"
  description: "Creates task for vulnerabilities."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dependabot
      port: 8080
      tools:
        - name: dependabot-to-jira-security
          description: "Creates task for vulnerabilities."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Dependabot to Jira Security"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Dependabot to Jira Security triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates incident for problems.

naftiko: "0.5"
info:
  label: "Dynatrace to ServiceNow"
  description: "Creates incident for problems."
  tags:
    - observability
    - itsm
    - dynatrace
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dynatrace
      port: 8080
      tools:
        - name: dynatrace-to-servicenow
          description: "Creates incident for problems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Dynatrace to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Dynatrace to ServiceNow triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Workday termination is recorded, suspends the Okta account, removes Salesforce user licenses, and creates a ServiceNow offboarding task.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Deprovisioning"
  description: "When a Workday termination is recorded, suspends the Okta account, removes Salesforce user licenses, and creates a ServiceNow offboarding task."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID, suspend the Okta account, remove Salesforce user permissions, and create a ServiceNow offboarding task. Use when an Oracle employee separates from the company."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: last_day
              in: body
              type: string
              description: "Employee's last working day in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: suspend-okta
              type: call
              call: "okta.suspend-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: freeze-salesforce-user
              type: call
              call: "salesforce.update-user"
              with:
                user_id: "{{get-employee.salesforce_user_id}}"
                is_active: "false"
            - name: create-offboarding-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Offboarding: {{get-employee.full_name}} — last day {{last_day}}"
                category: "hr_offboarding"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://oracle.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-suspend
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - microsoft-teams
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 across ServiceNow, Okta, and Microsoft Teams. Use when a new Oracle employee joins globally."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in ISO 8601 format (YYYY-MM-DD)."
            - name: business_unit
              in: body
              type: string
              description: "Oracle business unit for the new hire (e.g., 'Cloud Infrastructure')."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                category: "hr_onboarding"
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                assigned_group: "IT_Onboarding"
            - name: activate-okta-user
              type: call
              call: "okta.activate-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Oracle, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-onboarding-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://oracle.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/activate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: activate-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Suspends on risk.

naftiko: "0.5"
info:
  label: "Entra Risk to Okta Suspend"
  description: "Suspends on risk."
  tags:
    - security
    - identity
    - azure
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: entra
      port: 8080
      tools:
        - name: entra-risk-to-okta-suspend
          description: "Suspends on risk."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Entra Risk to Okta Suspend"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Updates on completion.

naftiko: "0.5"
info:
  label: "Epic to Salesforce"
  description: "Updates on completion."
  tags:
    - devops
    - crm
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: epic
      port: 8080
      tools:
        - name: epic-to-salesforce
          description: "Updates on completion."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Epic to Salesforce"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Epic to Salesforce triggered"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Posts failure to Slack.

naftiko: "0.5"
info:
  label: "GitHub Actions Failure"
  description: "Posts failure to Slack."
  tags:
    - devops
    - ci-cd
    - github
    - slack
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: github-actions-failure-notify
          description: "Posts failure to Slack."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "GitHub Actions Failure triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

On a GitHub Actions failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering Slack channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering Slack channel."
  tags:
    - devops
    - ci-cd
    - 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, create a Jira bug, post a Datadog event marker, and alert the #engineering-alerts Slack channel. Use when a CI/CD pipeline fails on a protected branch in Oracle's GitHub org."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: repository
              in: body
              type: string
              description: "The GitHub repository full name (e.g., 'oracle/graal')."
            - name: branch
              in: body
              type: string
              description: "The branch name where the failure occurred."
            - name: failed_job
              in: body
              type: string
              description: "Name of the failed workflow job."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the run."
            - name: log_url
              in: body
              type: string
              description: "URL to the full pipeline failure log."
          steps:
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}} — {{failed_job}}"
                description: "Pipeline: {{pipeline_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nLog: {{log_url}}"
            - name: post-datadog-event
              type: call
              call: "datadog.create-event"
              with:
                title: "CI Failure: {{repository}} {{branch}}"
                text: "Job {{failed_job}} failed. Commit: {{commit_sha}}"
                alert_type: "error"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "engineering-alerts"
                text: "Pipeline Failure: {{repository}} | Branch: {{branch}} | Job: {{failed_job}} | Jira: {{create-jira-bug.key}} | Log: {{log_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches open Dependabot security alerts for a GitHub repository and creates Jira security tickets for critical severity findings.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Vulnerability Triage"
  description: "Fetches open Dependabot security alerts for a GitHub repository and creates Jira security tickets for critical severity findings."
  tags:
    - security
    - devops
    - github
    - jira
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: vuln-triage
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Fetch open Dependabot alerts at critical severity for a GitHub repository and create a Jira ticket for remediation. Use during weekly vulnerability review or after a new CVE disclosure affecting Oracle's open source projects."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "GitHub repository name within the Oracle org (e.g., 'graalvm/graal')."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for security remediation tickets (e.g., 'SECURITY')."
          steps:
            - name: list-alerts
              type: call
              call: "github.list-dependabot-alerts"
              with:
                owner: "oracle"
                repo: "{{repository}}"
                severity: "critical"
                state: "open"
            - name: create-security-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Dependabot critical vulnerabilities in {{repository}}"
                description: "Open critical Dependabot alerts in {{repository}}. Immediate remediation required per Oracle security policy."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: severity
              in: query
            - name: state
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Updates ServiceNow change on PR merge.

naftiko: "0.5"
info:
  label: "GitHub PR to ServiceNow Change"
  description: "Updates ServiceNow change on PR merge."
  tags:
    - devops
    - itsm
    - github
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: github-pr-to-servicenow-change
          description: "Updates ServiceNow change on PR merge."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "GitHub PR to ServiceNow Change"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "GitHub PR to ServiceNow Change triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches GitHub code scanning alerts for a pull request and blocks merge by creating a Jira security ticket if critical findings are present.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Security Scan Gate"
  description: "Fetches GitHub code scanning alerts for a pull request and blocks merge by creating a Jira security ticket if critical findings are present."
  tags:
    - security
    - devops
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: security-gate
      port: 8080
      tools:
        - name: gate-pr-on-security-scan
          description: "Fetch GitHub code scanning alerts for a repository ref. If critical or high severity findings exist, create a Jira security ticket. Use as a pull request gate before merging to main branch."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository name within the Oracle org."
            - name: ref
              in: body
              type: string
              description: "The git ref (branch or SHA) to check for security alerts."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for security tickets (e.g., 'SECURITY')."
          steps:
            - name: get-scan-alerts
              type: call
              call: "github.list-code-scanning-alerts"
              with:
                owner: "oracle"
                repo: "{{repository}}"
                ref: "{{ref}}"
                severity: "critical"
            - name: create-security-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Security scan: critical findings in {{repository}} @ {{ref}}"
                description: "Critical code scanning alerts found in {{repository}} on {{ref}}. Review and remediate before merging."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{owner}}/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: ref
              in: query
            - name: severity
              in: query
          operations:
            - name: list-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves GitHub repository metadata.

naftiko: "0.5"
info:
  label: "GitHub Repository Lookup"
  description: "Retrieves GitHub repository metadata."
  tags:
    - devops
    - github
    - code-management
capability:
  exposes:
    - type: mcp
      namespace: code-mgmt
      port: 8080
      tools:
        - name: get-repo
          description: "Given owner/repo, return metadata."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo"
          call: github.get-repo
          with:
            repo: "{{repo}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          operations:
            - name: get-repo
              method: GET

Returns current headcount by department and region from Workday, used for Oracle workforce planning and executive reporting.

naftiko: "0.5"
info:
  label: "Global Headcount Snapshot"
  description: "Returns current headcount by department and region from Workday, used for Oracle workforce planning and executive reporting."
  tags:
    - hr
    - workforce-planning
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Return a snapshot of active Oracle employees grouped by department, region, and cost center from Workday. Use for global workforce planning, executive headcount reviews, or finance reporting."
          call: "workday.list-workers"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
            - name: total_count
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers"
          operations:
            - name: list-workers
              method: GET

Creates incident with runbook.

naftiko: "0.5"
info:
  label: "Grafana to ServiceNow"
  description: "Creates incident with runbook."
  tags:
    - observability
    - itsm
    - grafana
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: grafana-alert-to-incident
          description: "Creates incident with runbook."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Grafana to ServiceNow"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Grafana to ServiceNow"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://oracle-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Searches HubSpot for contact by email.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lookup"
  description: "Searches HubSpot for contact by email."
  tags:
    - crm
    - marketing
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: crm-marketing
      port: 8080
      tools:
        - name: search-contact
          description: "Given email, find contact."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email"
          call: hubspot.search-contacts
          with:
            email: "{{email}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/search"
          operations:
            - name: search-contacts
              method: POST

Syncs leads to Salesforce.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce"
  description: "Syncs leads to Salesforce."
  tags:
    - crm
    - marketing
    - hubspot
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hubspot
      port: 8080
      tools:
        - name: hubspot-lead-to-salesforce
          description: "Syncs leads to Salesforce."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "hubspot.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "HubSpot Lead to Salesforce triggered"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://hubspot.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches HubSpot email campaign performance for the past 30 days and publishes a digest to the Oracle marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Campaign Digest"
  description: "Fetches HubSpot email campaign performance for the past 30 days and publishes a digest to the Oracle marketing Microsoft Teams channel."
  tags:
    - marketing
    - hubspot
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Fetch HubSpot email campaign metrics for the past 30 days and post open rate, click rate, and conversion stats to the marketing Teams channel. Use for monthly marketing performance reviews."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The HubSpot campaign ID to report on."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the marketing team."
          steps:
            - name: get-campaign-stats
              type: call
              call: "hubspot.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Campaign Performance: {{get-campaign-stats.name}} | Sent: {{get-campaign-stats.numSent}} | Open Rate: {{get-campaign-stats.openRate}} | Click Rate: {{get-campaign-stats.clickRate}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaign-stats
          path: "/emails/statistics/list"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Syncs HubSpot marketing contacts that have crossed the MQL threshold into Salesforce as leads, with lead source and engagement data.

naftiko: "0.5"
info:
  label: "HubSpot to Salesforce Contact Sync"
  description: "Syncs HubSpot marketing contacts that have crossed the MQL threshold into Salesforce as leads, with lead source and engagement data."
  tags:
    - marketing
    - sales
    - hubspot
    - salesforce
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: mql-sync
      port: 8080
      tools:
        - name: sync-mql-to-salesforce
          description: "Given a HubSpot contact ID, fetch contact and engagement details and create a Salesforce lead record with lead source and HubSpot score. Use when a HubSpot contact reaches MQL status for sales follow-up."
          inputParameters:
            - name: hubspot_contact_id
              in: body
              type: string
              description: "The HubSpot contact ID to sync as a Salesforce lead."
          steps:
            - name: get-hubspot-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{hubspot_contact_id}}"
            - name: create-salesforce-lead
              type: call
              call: "salesforce.create-lead"
              with:
                first_name: "{{get-hubspot-contact.firstname}}"
                last_name: "{{get-hubspot-contact.lastname}}"
                email: "{{get-hubspot-contact.email}}"
                company: "{{get-hubspot-contact.company}}"
                lead_source: "HubSpot MQL"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST

Creates ServiceNow problem for recurring bugs.

naftiko: "0.5"
info:
  label: "Jira Bug to ServiceNow Problem"
  description: "Creates ServiceNow problem for recurring bugs."
  tags:
    - devops
    - itsm
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-bug-to-servicenow-problem
          description: "Creates ServiceNow problem for recurring bugs."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Jira Bug to ServiceNow Problem"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves Jira issue status and assignee.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves Jira issue status and assignee."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: project-mgmt
      port: 8080
      tools:
        - name: get-issue
          description: "Given issue key, return status."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Issue Key"
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          operations:
            - name: get-issue
              method: GET

Publishes release notes.

naftiko: "0.5"
info:
  label: "Jira Release to Confluence"
  description: "Publishes release notes."
  tags:
    - devops
    - documentation
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-release-to-confluence
          description: "Publishes release notes."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Jira Release to Confluence"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Jira Release to Confluence triggered"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches the completed sprint metrics for a Jira board and publishes a sprint retrospective summary to Confluence.

naftiko: "0.5"
info:
  label: "Jira Sprint Completion Report"
  description: "Fetches the completed sprint metrics for a Jira board and publishes a sprint retrospective summary to Confluence."
  tags:
    - devops
    - jira
    - confluence
    - reporting
    - agile
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: publish-sprint-report
          description: "Given a Jira board ID and completed sprint ID, fetch sprint velocity, completion rate, and bug count, then publish a sprint report to Confluence. Use for sprint retrospectives or engineering velocity tracking."
          inputParameters:
            - name: board_id
              in: body
              type: integer
              description: "The Jira agile board ID to report on."
            - name: sprint_id
              in: body
              type: integer
              description: "The completed Jira sprint ID."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for sprint reports."
            - name: confluence_parent_id
              in: body
              type: string
              description: "Confluence parent page ID for the sprint report."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira.search-issues"
              with:
                jql: "sprint = {{sprint_id}} AND project = ORDER BY status"
            - name: publish-sprint-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                parent_page_id: "{{confluence_parent_id}}"
                title: "Sprint Report — Sprint {{sprint_id}}"
                content: "Sprint {{sprint_id}} completion report. Total issues: {{get-sprint-issues.total}}. Board: {{board_id}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Creates ticket for latency.

naftiko: "0.5"
info:
  label: "Latency Spike to Jira"
  description: "Creates ticket for latency."
  tags:
    - observability
    - devops
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: latency
      port: 8080
      tools:
        - name: latency-spike-to-jira
          description: "Creates ticket for latency."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Latency Spike to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Latency Spike to Jira triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Publishes an Oracle employer brand post to the LinkedIn company page and notifies the corporate communications Slack channel.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Post Publisher"
  description: "Publishes an Oracle employer brand post to the LinkedIn company page and notifies the corporate communications Slack channel."
  tags:
    - marketing
    - social
    - linkedin
    - slack
capability:
  exposes:
    - type: mcp
      namespace: brand-publishing
      port: 8080
      tools:
        - name: publish-linkedin-post
          description: "Given post text, publish an employer brand or product announcement post to the Oracle LinkedIn company page and notify the #corporate-comms Slack channel. Use for product launches, award announcements, or recruitment campaigns."
          inputParameters:
            - name: post_text
              in: body
              type: string
              description: "The text content of the LinkedIn post."
            - name: visibility
              in: body
              type: string
              description: "Post visibility: 'PUBLIC' or 'CONNECTIONS'."
          steps:
            - name: create-linkedin-post
              type: call
              call: "linkedin.create-ugc-post"
              with:
                text: "{{post_text}}"
                visibility: "{{visibility}}"
            - name: notify-comms
              type: call
              call: "slack.post-message"
              with:
                channel: "corporate-comms"
                text: "LinkedIn post published: {{create-linkedin-post.activity_id}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_access_token"
      resources:
        - name: ugc-posts
          path: "/ugcPosts"
          operations:
            - name: create-ugc-post
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates Slack channel and pages.

naftiko: "0.5"
info:
  label: "Major Incident Bridge"
  description: "Creates Slack channel and pages."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: major
      port: 8080
      tools:
        - name: major-incident-bridge
          description: "Creates Slack channel and pages."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "servicenow.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Major Incident Bridge"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Major Incident Bridge triggered"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://servicenow.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves app health from New Relic.

naftiko: "0.5"
info:
  label: "New Relic App Health"
  description: "Retrieves app health from New Relic."
  tags:
    - observability
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: app-health
      port: 8080
      tools:
        - name: get-health
          description: "Given app name, return health."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "App Name"
          call: newrelic.get-app
          with:
            name: "{{app_name}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: applications
          path: "/applications.json"
          operations:
            - name: get-app
              method: GET

Creates Jira bug for errors.

naftiko: "0.5"
info:
  label: "New Relic Error to Jira"
  description: "Creates Jira bug for errors."
  tags:
    - observability
    - devops
    - new-relic
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: new
      port: 8080
      tools:
        - name: new-relic-error-to-jira
          description: "Creates Jira bug for errors."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "New Relic Error to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "New Relic Error to Jira triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Resets MFA and closes ticket.

naftiko: "0.5"
info:
  label: "Okta MFA Reset with ServiceNow"
  description: "Resets MFA and closes ticket."
  tags:
    - security
    - identity
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-mfa-reset-servicenow
          description: "Resets MFA and closes ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta MFA Reset with ServiceNow"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Generates a list of Okta users with privileged group memberships and publishes the access certification report to Confluence for IT security review.

naftiko: "0.5"
info:
  label: "Okta Quarterly Access Certification"
  description: "Generates a list of Okta users with privileged group memberships and publishes the access certification report to Confluence for IT security review."
  tags:
    - identity
    - security
    - okta
    - confluence
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: access-certification
      port: 8080
      tools:
        - name: run-access-certification
          description: "List all users in privileged Okta groups and publish a quarterly access certification report to Confluence. Use for SOX, ISO 27001, or FedRAMP access review cycles."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID to audit for privileged access."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for the access certification report."
            - name: confluence_parent_id
              in: body
              type: string
              description: "Confluence parent page ID for the quarterly report."
          steps:
            - name: list-group-users
              type: call
              call: "okta.list-group-members"
              with:
                group_id: "{{okta_group_id}}"
            - name: publish-cert-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                parent_page_id: "{{confluence_parent_id}}"
                title: "Quarterly Access Certification — Group {{okta_group_id}}"
                content: "Privileged access certification for Okta group {{okta_group_id}}. Users: {{list-group-users.count}}. Review and certify or revoke access for each entry."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://oracle.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Investigates and creates incident.

naftiko: "0.5"
info:
  label: "Okta Risky Login"
  description: "Investigates and creates incident."
  tags:
    - security
    - identity
    - okta
    - splunk
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-risky-login-investigation
          description: "Investigates and creates incident."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta Risky Login"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Lists Okta groups for a user.

naftiko: "0.5"
info:
  label: "Okta User Groups Lookup"
  description: "Lists Okta groups for a user."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-groups
          description: "Given email, return groups."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email"
          call: okta.get-user-groups
          with:
            user_id: "{{email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://oracle.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: groups
          path: "/users/{{user_id}}/groups"
          operations:
            - name: get-user-groups
              method: GET

Automatically provisions a new Okta user profile when a new hire record is created in Workday, assigning the correct department groups.

naftiko: "0.5"
info:
  label: "Okta User Provisioning from Workday Hire"
  description: "Automatically provisions a new Okta user profile when a new hire record is created in Workday, assigning the correct department groups."
  tags:
    - identity
    - hr
    - okta
    - workday
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: identity-provisioning
      port: 8080
      tools:
        - name: provision-new-user
          description: "Given a Workday employee ID, create an Okta user profile with the correct department group assignments. Use when a new hire record is created in Workday to automate SSO provisioning."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: okta_department_group_id
              in: body
              type: string
              description: "The Okta group ID for the employee's department."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-okta-user
              type: call
              call: "okta.create-user"
              with:
                first_name: "{{get-employee.first_name}}"
                last_name: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
                login: "{{get-employee.work_email}}"
            - name: add-to-department-group
              type: call
              call: "okta-group.add-user-to-group"
              with:
                group_id: "{{okta_department_group_id}}"
                user_id: "{{create-okta-user.id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://oracle.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: okta-group
      baseUri: "https://oracle.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/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT

Loads invoices.

naftiko: "0.5"
info:
  label: "Oracle Invoice to Snowflake"
  description: "Loads invoices."
  tags:
    - finance
    - data
    - oracle
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: oracle
      port: 8080
      tools:
        - name: oracle-invoice-to-snowflake
          description: "Loads invoices."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

When a PagerDuty incident is resolved, creates a Confluence postmortem page and notifies the engineering team via Slack.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Resolution Postmortem"
  description: "When a PagerDuty incident is resolved, creates a Confluence postmortem page and notifies the engineering team via Slack."
  tags:
    - itsm
    - pagerduty
    - confluence
    - slack
    - postmortem
capability:
  exposes:
    - type: mcp
      namespace: postmortem-ops
      port: 8080
      tools:
        - name: create-incident-postmortem
          description: "Given a resolved PagerDuty incident ID, fetch incident details and create a Confluence postmortem page, then notify the engineering Slack channel. Use when a P1/P2 incident is resolved to begin the postmortem process."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The resolved PagerDuty incident ID."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for postmortem documents."
            - name: confluence_parent_id
              in: body
              type: string
              description: "Confluence parent page ID for postmortems."
            - name: slack_channel
              in: body
              type: string
              description: "Engineering Slack channel to notify of new postmortem."
          steps:
            - name: get-pd-incident
              type: call
              call: "pagerduty.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: create-postmortem-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                parent_page_id: "{{confluence_parent_id}}"
                title: "Postmortem: {{get-pd-incident.title}} ({{get-pd-incident.created_at}})"
                content: "Incident: {{get-pd-incident.title}}\nID: {{incident_id}}\nSeverity: {{get-pd-incident.urgency}}\nCreated: {{get-pd-incident.created_at}}\nResolved: {{get-pd-incident.resolved_at}}\n\nTimeline, root cause, and action items to be completed by the team."
            - name: notify-engineering
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Postmortem Created: {{get-pd-incident.title}} | Confluence: {{create-postmortem-page.webui_url}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves current on-call engineer.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves current on-call engineer."
  tags:
    - operations
    - pagerduty
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ops
      port: 8080
      tools:
        - name: get-on-call
          description: "Given schedule ID, return on-call."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule Id"
          call: pagerduty.get-on-call
          with:
            schedule_id: "{{schedule_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          operations:
            - name: get-on-call
              method: GET

Fetches the current on-call engineer for a PagerDuty schedule and returns their contact information for incident routing.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Fetches the current on-call engineer for a PagerDuty schedule and returns their contact information for incident routing."
  tags:
    - itsm
    - pagerduty
    - incident-response
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: oncall-ops
      port: 8080
      tools:
        - name: get-oncall-engineer
          description: "Given a PagerDuty schedule ID, return the current on-call engineer's name and contact info. Use to identify the correct responder before creating incidents or escalations."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID to query for the current on-call engineer."
          call: "pagerduty.get-oncall"
          with:
            schedule_ids: "{{schedule_id}}"
          outputParameters:
            - name: oncall_user_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: oncall_user_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: schedule_ids
              in: query
          operations:
            - name: get-oncall
              method: GET

Creates postmortem page.

naftiko: "0.5"
info:
  label: "PagerDuty to Confluence Postmortem"
  description: "Creates postmortem page."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pagerduty
      port: 8080
      tools:
        - name: pagerduty-to-confluence-postmortem
          description: "Creates postmortem page."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "pagerduty.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "PagerDuty to Confluence Postmortem"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "PagerDuty to Confluence Postmortem triggered"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://pagerduty.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Compares ADP vs Workday.

naftiko: "0.5"
info:
  label: "Payroll Audit"
  description: "Compares ADP vs Workday."
  tags:
    - hr
    - finance
    - adp
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: payroll
      port: 8080
      tools:
        - name: payroll-audit
          description: "Compares ADP vs Workday."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "adp.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Payroll Audit"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://adp.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Refreshes and distributes.

naftiko: "0.5"
info:
  label: "Power BI Distribution"
  description: "Refreshes and distributes."
  tags:
    - analytics
    - reporting
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: power
      port: 8080
      tools:
        - name: power-bi-distribution
          description: "Refreshes and distributes."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Power BI Distribution triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Power BI dataset refresh.

naftiko: "0.5"
info:
  label: "Power BI Refresh Status"
  description: "Checks Power BI dataset refresh."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: reporting
      port: 8080
      tools:
        - name: get-refresh
          description: "Given dataset ID, return status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset Id"
          call: powerbi.get-refresh
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          operations:
            - name: get-refresh
              method: GET

Posts runbook to Slack.

naftiko: "0.5"
info:
  label: "Runbook from PagerDuty"
  description: "Posts runbook to Slack."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: runbook
      port: 8080
      tools:
        - name: runbook-from-pagerduty
          description: "Posts runbook to Slack."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "pagerduty.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Runbook from PagerDuty"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Runbook from PagerDuty triggered"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://pagerduty.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates tasks for violations.

naftiko: "0.5"
info:
  label: "S3 Compliance Scan"
  description: "Creates tasks for violations."
  tags:
    - security
    - compliance
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: s3
      port: 8080
      tools:
        - name: s3-compliance-scan
          description: "Creates tasks for violations."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "aws.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "S3 Compliance Scan"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "S3 Compliance Scan triggered"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://aws.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Salesforce opportunity is marked Closed Won, creates a Jira project for implementation delivery and notifies the project management team via Slack.

naftiko: "0.5"
info:
  label: "Salesforce Closed Won to Jira Project Creation"
  description: "When a Salesforce opportunity is marked Closed Won, creates a Jira project for implementation delivery and notifies the project management team via Slack."
  tags:
    - sales
    - devops
    - salesforce
    - jira
    - slack
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: deal-to-delivery
      port: 8080
      tools:
        - name: create-delivery-project
          description: "Given a Salesforce Closed Won opportunity ID, fetch deal details and create a Jira implementation project, then notify the delivery team Slack channel. Use when a deal closes to kick off the implementation lifecycle."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID that just closed won."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key to create for delivery (e.g., 'IMPL')."
            - name: slack_channel
              in: body
              type: string
              description: "Delivery team Slack channel to notify."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-jira-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Epic"
                summary: "Implementation: {{get-opportunity.Name}}"
                description: "Customer: {{get-opportunity.AccountName}}\nContract Value: {{get-opportunity.Amount}}\nClose Date: {{get-opportunity.CloseDate}}\nSFDC: {{opportunity_id}}"
            - name: notify-delivery
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "New Deal Closed: {{get-opportunity.Name}} ({{get-opportunity.Amount}}) — Jira Epic created: {{create-jira-epic.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Identifies Salesforce accounts with expiring contracts in the next 90 days that have open P1 support cases and alerts the customer success team via Slack.

naftiko: "0.5"
info:
  label: "Salesforce Customer Renewal Risk Alert"
  description: "Identifies Salesforce accounts with expiring contracts in the next 90 days that have open P1 support cases and alerts the customer success team via Slack."
  tags:
    - sales
    - customer-success
    - salesforce
    - slack
    - renewal-management
capability:
  exposes:
    - type: mcp
      namespace: renewal-risk
      port: 8080
      tools:
        - name: alert-renewal-risk-accounts
          description: "Query Salesforce for accounts with contracts expiring in 90 days that also have open P1 cases. Post at-risk accounts to the customer success Slack channel. Use weekly to prevent undetected renewal risk."
          inputParameters:
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for renewal risk alerts (e.g., '#customer-success')."
            - name: territory
              in: body
              type: string
              description: "Salesforce territory to scope the query."
          steps:
            - name: query-at-risk-accounts
              type: call
              call: "salesforce.query-soql"
              with:
                q: "SELECT Account.Name, Contract.EndDate, COUNT(Case.Id) FROM Contract WHERE Contract.EndDate = NEXT_N_DAYS:90 AND Account.Territory2.Name = '{{territory}}'"
            - name: post-risk-alert
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Renewal Risk Alert — {{territory}}: {{query-at-risk-accounts.totalSize}} accounts have contracts expiring in 90 days. Review in Salesforce for intervention."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql-query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-soql
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Salesforce lead reaches an MQL score threshold, converts it to an opportunity, creates a Jira discovery task, and notifies the assigned sales rep via Slack.

naftiko: "0.5"
info:
  label: "Salesforce Lead to Opportunity Conversion"
  description: "When a Salesforce lead reaches an MQL score threshold, converts it to an opportunity, creates a Jira discovery task, and notifies the assigned sales rep via Slack."
  tags:
    - sales
    - crm
    - salesforce
    - jira
    - slack
    - lead-qualification
capability:
  exposes:
    - type: mcp
      namespace: mql-conversion
      port: 8080
      tools:
        - name: convert-lead-to-opportunity
          description: "Given a Salesforce lead ID, fetch lead details, create a converted Salesforce opportunity, open a Jira discovery task, and notify the sales rep on Slack. Use when an inbound MQL is ready for sales handoff."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to convert (18-character SFDC ID)."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for the sales discovery task (e.g., 'SALES')."
            - name: sales_rep_slack_id
              in: body
              type: string
              description: "The Slack user ID of the assigned sales representative."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: create-opportunity
              type: call
              call: "salesforce-opp.create-opportunity"
              with:
                name: "{{get-lead.Company}} — {{get-lead.ProductInterest__c}}"
                stage: "Prospecting"
                close_date: "2026-09-30"
            - name: create-discovery-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Discovery: {{get-lead.Company}} | {{get-lead.FirstName}} {{get-lead.LastName}}"
                description: "New MQL converted. Lead: {{lead_id}}. SFDC Opportunity: {{create-opportunity.id}}."
            - name: notify-sales-rep
              type: call
              call: "slack.post-dm"
              with:
                user_id: "{{sales_rep_slack_id}}"
                text: "New Opportunity Created: {{get-lead.Company}} converted from lead. SFDC Opp: {{create-opportunity.id}} | Jira: {{create-discovery-task.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: salesforce-opp
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: dm-messages
          path: "/chat.postMessage"
          operations:
            - name: post-dm
              method: POST

Fetches all open Salesforce opportunities in the current quarter, aggregates by stage and owner, and posts a pipeline digest to the sales leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Report"
  description: "Fetches all open Salesforce opportunities in the current quarter, aggregates by stage and owner, and posts a pipeline digest to the sales leadership Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-opportunity-pipeline
          description: "Query open Salesforce opportunities for the current quarter, compute pipeline value by stage, and post a digest to the sales leadership Teams channel. Use for weekly pipeline reviews or CRO briefings."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Salesforce sales region to filter by (e.g., 'North America', 'EMEA')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the sales leadership team."
          steps:
            - name: query-open-opportunities
              type: call
              call: "salesforce.query-soql"
              with:
                q: "SELECT Name, StageName, Amount, CloseDate, Owner.Name FROM Opportunity WHERE IsClosed = false AND CloseDate = THIS_QUARTER AND Region__c = '{{region}}'"
            - name: post-pipeline-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Pipeline Digest — {{region}} (This Quarter): {{query-open-opportunities.totalSize}} open opportunities. Review full breakdown in Salesforce."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql-query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-soql
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Salesforce opportunity details.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Status"
  description: "Retrieves Salesforce opportunity details."
  tags:
    - crm
    - salesforce
    - sales
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Given ID, return stage and amount."
          inputParameters:
            - name: opp_id
              in: body
              type: string
              description: "Opp Id"
          call: salesforce.get-opportunity
          with:
            id: "{{opp_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://oracle.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          operations:
            - name: get-opportunity
              method: GET

Creates Jira project on Closed-Won.

naftiko: "0.5"
info:
  label: "Salesforce Won to Jira Project"
  description: "Creates Jira project on Closed-Won."
  tags:
    - crm
    - devops
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: salesforce-won-to-jira-project
          description: "Creates Jira project on Closed-Won."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Salesforce Won to Jira Project"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Salesforce Won to Jira Project triggered"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Updates with delivery status.

naftiko: "0.5"
info:
  label: "SAP Delivery to Salesforce"
  description: "Updates with delivery status."
  tags:
    - erp
    - crm
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-delivery-to-salesforce
          description: "Updates with delivery status."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Retrieves SAP PO status.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Retrieves SAP PO status."
  tags:
    - finance
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-po
          description: "Given PO number, return status."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "Po Number"
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://oracle-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pos
          path: "/A_PurchaseOrder('{{po_number}}')"
          operations:
            - name: get-po
              method: GET

Alerts low stock.

naftiko: "0.5"
info:
  label: "SAP Stock Alert"
  description: "Alerts low stock."
  tags:
    - erp
    - supply-chain
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-stock-alert-to-slack
          description: "Alerts low stock."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "SAP Stock Alert triggered"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves ServiceNow incident details.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status"
  description: "Retrieves ServiceNow incident details."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given number, return status."
          inputParameters:
            - name: number
              in: body
              type: string
              description: "Number"
          call: servicenow.get-incident
          with:
            number: "{{number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Creates a ServiceNow change request for an Oracle Database maintenance patch, including a maintenance window, and notifies the DBA team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request for Database Patch"
  description: "Creates a ServiceNow change request for an Oracle Database maintenance patch, including a maintenance window, and notifies the DBA team via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - database
capability:
  exposes:
    - type: mcp
      namespace: db-change-ops
      port: 8080
      tools:
        - name: create-database-patch-change"
          description: "Given database system ID, patch description, and maintenance window, create a ServiceNow change request and notify the DBA team via Microsoft Teams. Use for Oracle Database patching and quarterly critical patch updates (CPU)."
          inputParameters:
            - name: db_system_id
              in: body
              type: string
              description: "The Oracle Database system identifier being patched (e.g., 'PROD-ODB-01')."
            - name: patch_description
              in: body
              type: string
              description: "Description of the database patch or critical patch update."
            - name: maintenance_start
              in: body
              type: string
              description: "Maintenance window start in ISO 8601 format."
            - name: maintenance_end
              in: body
              type: string
              description: "Maintenance window end in ISO 8601 format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel to notify the DBA team."
          steps:
            - name: create-change-request
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Oracle DB patch: {{db_system_id}} — {{patch_description}}"
                category: "Database"
                planned_start_date: "{{maintenance_start}}"
                planned_end_date: "{{maintenance_end}}"
            - name: notify-dba-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Database Maintenance: {{db_system_id}} scheduled for patching from {{maintenance_start}} to {{maintenance_end}}. Change Request: {{create-change-request.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

On a P1 ServiceNow incident, creates a Jira escalation issue, posts an alert to PagerDuty, and notifies the incident response Slack channel.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Response Chain"
  description: "On a P1 ServiceNow incident, creates a Jira escalation issue, posts an alert to PagerDuty, and notifies the incident response Slack channel."
  tags:
    - itsm
    - incident-response
    - servicenow
    - jira
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a ServiceNow P1 incident number, create a Jira escalation issue, trigger a PagerDuty incident, and post a war-room link to the #incidents Slack channel. Use immediately when a production P1 is declared."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow P1 incident number (e.g., 'INC0012345')."
            - name: pagerduty_service_id
              in: body
              type: string
              description: "The PagerDuty service ID responsible for the affected system."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-jira-escalation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "OPS"
                issuetype: "Bug"
                priority: "Highest"
                summary: "[P1] {{get-incident.short_description}}"
                description: "ServiceNow P1: {{incident_number}}\n{{get-incident.description}}"
            - name: trigger-pagerduty
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service_id}}"
                title: "P1: {{get-incident.short_description}}"
                incident_key: "{{incident_number}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "incidents"
                text: "P1 INCIDENT: {{incident_number}} | {{get-incident.short_description}} | Jira: {{create-jira-escalation.key}} | PD: {{trigger-pagerduty.incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Posts message to Slack channel.

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

Queries Snowflake account usage for credit consumption by warehouse and posts the cost report to the FinOps Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Cloud Data Warehouse Cost Report"
  description: "Queries Snowflake account usage for credit consumption by warehouse and posts the cost report to the FinOps Slack channel."
  tags:
    - finops
    - data
    - snowflake
    - slack
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: report-warehouse-costs
          description: "Query Snowflake credit consumption by virtual warehouse over a given date range and post the cost summary to the FinOps Slack channel. Use for weekly or monthly cloud cost reviews."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Report start date in ISO 8601 format (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date in ISO 8601 format (YYYY-MM-DD)."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for the cost report (e.g., '#finops')."
          steps:
            - name: query-credit-usage
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT WAREHOUSE_NAME, SUM(CREDITS_USED) as TOTAL_CREDITS FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY WHERE START_TIME BETWEEN '{{start_date}}' AND '{{end_date}}' GROUP BY WAREHOUSE_NAME ORDER BY TOTAL_CREDITS DESC"
            - name: post-cost-report
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Snowflake Cost Report ({{start_date}} to {{end_date}}): Query executed. Review warehouse credit consumption for cost optimization opportunities."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://oracle.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Alerts on credit overage.

naftiko: "0.5"
info:
  label: "Snowflake Cost Alert"
  description: "Alerts on credit overage."
  tags:
    - data
    - finops
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: snowflake-cost-to-finops
          description: "Alerts on credit overage."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Snowflake Cost Alert"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Snowflake Cost Alert triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes a SQL data quality assertion against a Snowflake analytics table and blocks downstream pipeline runs by posting a fail alert to Slack.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Gate for Analytics Pipeline"
  description: "Executes a SQL data quality assertion against a Snowflake analytics table and blocks downstream pipeline runs by posting a fail alert to Slack."
  tags:
    - data
    - analytics
    - snowflake
    - slack
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: analytics-quality
      port: 8080
      tools:
        - name: run-analytics-data-check
          description: "Execute a SQL data quality assertion against a Snowflake analytics table and post pass/fail results to Slack. Use as a gate before loading data into Oracle Analytics or BI dashboards."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully-qualified Snowflake table name (e.g., 'ANALYTICS_DB.SALES.OPPORTUNITY_FACTS')."
            - name: sql_assertion
              in: body
              type: string
              description: "The SQL quality assertion to execute. Should return 0 rows on pass."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel to post quality results to."
          steps:
            - name: execute-assertion
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "{{sql_assertion}}"
            - name: post-result
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Data Quality Check on {{table_name}}: Assertion executed. Review results — statement handle: {{execute-assertion.statementHandle}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://oracle.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates Jira task for data anomalies.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality to Jira"
  description: "Creates Jira task for data anomalies."
  tags:
    - data
    - quality
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: snowflake-quality-to-jira
          description: "Creates Jira task for data anomalies."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Snowflake Data Quality to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Snowflake Data Quality to Jira triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes read-only SQL against Snowflake.

naftiko: "0.5"
info:
  label: "Snowflake Query Runner"
  description: "Executes read-only SQL against Snowflake."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Given SQL, execute query."
          inputParameters:
            - name: sql
              in: body
              type: string
              description: "Sql"
          call: snowflake.execute-query
          with:
            statement: "{{sql}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://oracle.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Creates incident for down.

naftiko: "0.5"
info:
  label: "SolarWinds to PagerDuty"
  description: "Creates incident for down."
  tags:
    - networking
    - incident-response
    - solarwinds
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: solarwinds
      port: 8080
      tools:
        - name: solarwinds-to-pagerduty
          description: "Creates incident for down."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "solarwinds.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "SolarWinds to PagerDuty"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.solarwinds_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Creates security incident from Splunk.

naftiko: "0.5"
info:
  label: "Splunk Alert to Security Incident"
  description: "Creates security incident from Splunk."
  tags:
    - security
    - siem
    - splunk
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: splunk
      port: 8080
      tools:
        - name: splunk-alert-to-security-incident
          description: "Creates security incident from Splunk."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "splunk.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Splunk Alert to Security Incident"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Splunk Alert to Security Incident triggered"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes Splunk SPL query.

naftiko: "0.5"
info:
  label: "Splunk Search Runner"
  description: "Executes Splunk SPL query."
  tags:
    - security
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: log-analysis
      port: 8080
      tools:
        - name: run-search
          description: "Given SPL query, execute."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query"
          call: splunk.create-search
          with:
            search: "{{query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.oracle.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Creates incident for failures.

naftiko: "0.5"
info:
  label: "Tableau to ServiceNow"
  description: "Creates incident for failures."
  tags:
    - analytics
    - itsm
    - tableau
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: tableau
      port: 8080
      tools:
        - name: tableau-failure-to-incident
          description: "Creates incident for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Tableau to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Tableau to ServiceNow triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates page from transcript.

naftiko: "0.5"
info:
  label: "Teams to Confluence"
  description: "Creates page from transcript."
  tags:
    - communication
    - documentation
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: teams
      port: 8080
      tools:
        - name: teams-to-confluence
          description: "Creates page from transcript."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "microsoft-teams.get-data"
              with:
                id: "{{input_id}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Teams to Confluence"
  consumes:
    - type: http
      namespace: microsoft-teams
      baseUri: "https://microsoft-teams.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.microsoft_teams_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Triggers a Terraform Cloud run for an infrastructure workspace, monitors for plan completion, and requires a ServiceNow change approval before applying.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning Gate"
  description: "Triggers a Terraform Cloud run for an infrastructure workspace, monitors for plan completion, and requires a ServiceNow change approval before applying."
  tags:
    - cloud
    - infrastructure
    - terraform
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: gate-terraform-apply
          description: "Given a Terraform Cloud workspace ID and ServiceNow change number, verify the change request is approved and trigger the Terraform apply. Use as a deployment gate for Oracle Cloud infrastructure changes."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID to apply (e.g., 'ws-abc123')."
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number authorizing this infrastructure change."
          steps:
            - name: check-change-approval
              type: call
              call: "servicenow.get-change-request"
              with:
                number: "{{change_number}}"
            - name: trigger-terraform-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                is_destroy: "false"
                message: "Authorized by change request {{change_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST

Retrieves Terraform Cloud cost estimate for a pending run and posts the projected infrastructure spend to the FinOps Slack channel for review.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Cost Estimation"
  description: "Retrieves Terraform Cloud cost estimate for a pending run and posts the projected infrastructure spend to the FinOps Slack channel for review."
  tags:
    - cloud
    - finops
    - terraform
    - slack
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: infra-cost
      port: 8080
      tools:
        - name: review-terraform-cost-estimate
          description: "Given a Terraform Cloud run ID, fetch the cost estimate for the planned infrastructure changes and post the projected monthly cost to the FinOps Slack channel. Use before applying large infrastructure changes."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Terraform Cloud run ID with a completed cost estimate (e.g., 'run-abc123')."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for the cost estimate review (e.g., '#finops')."
          steps:
            - name: get-cost-estimate
              type: call
              call: "terraform.get-run-cost-estimate"
              with:
                run_id: "{{run_id}}"
            - name: post-estimate
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Terraform Cost Estimate: Run {{run_id}} | Projected monthly cost: {{get-cost-estimate.proposed_monthly_cost}} | Delta: {{get-cost-estimate.delta_monthly_cost}}. Approve or reject the run in Terraform Cloud."
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs/{{run_id}}/cost-estimate"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run-cost-estimate
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates change for Terraform plan.

naftiko: "0.5"
info:
  label: "Terraform Plan to Change"
  description: "Creates change for Terraform plan."
  tags:
    - infrastructure
    - itsm
    - terraform
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: terraform
      port: 8080
      tools:
        - name: terraform-plan-to-change
          description: "Creates change for Terraform plan."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Terraform Plan to Change"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves Terraform workspace state.

naftiko: "0.5"
info:
  label: "Terraform Workspace Status"
  description: "Retrieves Terraform workspace state."
  tags:
    - infrastructure
    - terraform
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: infra
      port: 8080
      tools:
        - name: get-workspace
          description: "Given workspace, return status."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Workspace"
          call: terraform.get-workspace
          with:
            workspace: "{{workspace}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/oracle/workspaces/{{workspace}}"
          operations:
            - name: get-workspace
              method: GET

Generates a compensation band distribution report by department and job family from Workday and publishes it to Confluence for the compensation committee.

naftiko: "0.5"
info:
  label: "Workday Compensation Band Audit Report"
  description: "Generates a compensation band distribution report by department and job family from Workday and publishes it to Confluence for the compensation committee."
  tags:
    - hr
    - compensation
    - workday
    - confluence
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: comp-audit
      port: 8080
      tools:
        - name: publish-compensation-audit
          description: "Fetch compensation band distribution by department from Workday and publish the report to Confluence for the compensation committee. Use for annual pay equity reviews or board compensation reporting."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "Oracle business unit to scope the compensation report (e.g., 'Cloud Infrastructure')."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for the compensation report."
            - name: confluence_parent_id
              in: body
              type: string
              description: "Confluence parent page ID for the report."
          steps:
            - name: get-compensation-data
              type: call
              call: "workday.get-compensation-summary"
              with:
                business_unit: "{{business_unit}}"
            - name: publish-report
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space_key}}"
                parent_page_id: "{{confluence_parent_id}}"
                title: "Compensation Band Audit — {{business_unit}}"
                content: "Workday compensation band distribution for {{business_unit}}. Total employees in scope: {{get-compensation-data.total}}. Report generated for compensation committee review."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation-workers
          path: "/oracle/workers"
          inputParameters:
            - name: business_unit
              in: query
          operations:
            - name: get-compensation-summary
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://oracle.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves employee profile from Workday HCM.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile from Workday HCM."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Given worker ID, return profile."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Worker Id"
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers/{{worker_id}}"
          operations:
            - name: get-worker
              method: GET

Loads headcount snapshot.

naftiko: "0.5"
info:
  label: "Workday Headcount to Snowflake"
  description: "Loads headcount snapshot."
  tags:
    - hr
    - data
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-headcount-to-snowflake
          description: "Loads headcount snapshot."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Provisions Okta for new hires.

naftiko: "0.5"
info:
  label: "Workday New Hire to Okta"
  description: "Provisions Okta for new hires."
  tags:
    - hr
    - security
    - workday
    - okta
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-new-hire-to-okta
          description: "Provisions Okta for new hires."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Fetches payroll journal totals from Workday and cross-references against the Snowflake financial data warehouse to validate period accuracy.

naftiko: "0.5"
info:
  label: "Workday Payroll Journal to Snowflake Reconciliation"
  description: "Fetches payroll journal totals from Workday and cross-references against the Snowflake financial data warehouse to validate period accuracy."
  tags:
    - finance
    - payroll
    - workday
    - snowflake
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: payroll-reconciliation
      port: 8080
      tools:
        - name: reconcile-payroll-journals
          description: "Fetch payroll journal totals for a given pay period from Workday and compare against the Snowflake financial data warehouse. Post reconciliation status to the finance Slack channel. Use at month-end close."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier in YYYY-MM format (e.g., '2026-03')."
            - name: slack_channel
              in: body
              type: string
              description: "Finance Slack channel for reconciliation status."
          steps:
            - name: get-workday-journals
              type: call
              call: "workday.get-payroll-journals"
              with:
                pay_period: "{{pay_period}}"
            - name: get-snowflake-totals
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT SUM(AMOUNT) as TOTAL FROM FINANCIAL_DW.PUBLIC.PAYROLL_JOURNAL WHERE PAY_PERIOD = '{{pay_period}}'"
            - name: post-reconciliation-status
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Payroll Reconciliation {{pay_period}}: Workday journals fetched, Snowflake query complete. Please validate totals in the finance portal."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll-results
          path: "/oracle/payrollResults"
          inputParameters:
            - name: pay_period
              in: query
          operations:
            - name: get-payroll-journals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://oracle.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches all employees due for performance review from Workday and creates Jira tasks for their managers, notifying the HR team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Kickoff"
  description: "Fetches all employees due for performance review from Workday and creates Jira tasks for their managers, notifying the HR team via Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: perf-review
      port: 8080
      tools:
        - name: kickoff-performance-reviews
          description: "Fetch employees due for review from Workday, create manager Jira tasks, and notify HR via Microsoft Teams. Use to kick off Oracle's annual or mid-year performance review cycles."
          inputParameters:
            - name: review_cycle_name
              in: body
              type: string
              description: "Name of the review cycle (e.g., 'FY2026 Annual Review')."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for performance review tasks (e.g., 'HR')."
            - name: hr_teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for the HR organization."
          steps:
            - name: get-review-eligible
              type: call
              call: "workday.list-workers"
              with:
                review_cycle: "{{review_cycle_name}}"
            - name: create-jira-tasks
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Performance Review Cycle Kickoff: {{review_cycle_name}}"
                description: "All managers: please complete performance reviews in Workday for the {{review_cycle_name}} cycle by the deadline."
            - name: notify-hr
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{hr_teams_channel_id}}"
                text: "Performance review cycle '{{review_cycle_name}}' kicked off. Manager tasks created in Jira: {{create-jira-tasks.key}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers"
          inputParameters:
            - name: review_cycle
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://oracle.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee's role changes in Workday, updates their Okta group memberships to reflect the new access requirements.

naftiko: "0.5"
info:
  label: "Workday Role Change and Okta Group Sync"
  description: "When an employee's role changes in Workday, updates their Okta group memberships to reflect the new access requirements."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: role-access-sync
      port: 8080
      tools:
        - name: sync-role-access-change
          description: "Given a Workday employee ID, old Okta group ID, and new Okta group ID, remove the user from the old access group and add to the new one. Use when an Oracle employee is promoted or transfers between teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role changed."
            - name: old_okta_group_id
              in: body
              type: string
              description: "The Okta group ID for the previous role's access."
            - name: new_okta_group_id
              in: body
              type: string
              description: "The Okta group ID for the new role's access."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: remove-old-group
              type: call
              call: "okta-remove.remove-user-from-group"
              with:
                group_id: "{{old_okta_group_id}}"
                user_id: "{{get-employee.okta_user_id}}"
            - name: add-new-group
              type: call
              call: "okta-add.add-user-to-group"
              with:
                group_id: "{{new_okta_group_id}}"
                user_id: "{{get-employee.okta_user_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/oracle/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-remove
      baseUri: "https://oracle.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/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: remove-user-from-group
              method: DELETE
    - type: http
      namespace: okta-add
      baseUri: "https://oracle.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/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT

Syncs groups on role change.

naftiko: "0.5"
info:
  label: "Workday Role to Okta Groups"
  description: "Syncs groups on role change."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-role-to-okta-groups
          description: "Syncs groups on role change."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Workday Role to Okta Groups"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Deactivates Okta user on Workday termination and creates ServiceNow task.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "Deactivates Okta user on Workday termination and creates ServiceNow task."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-termination-to-okta-deprovisioning
          description: "Deactivates Okta user on Workday termination and creates ServiceNow task."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Workday Termination to Okta Deprovisioning"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.oracle.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://oracle.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST