Green Thumb Industries Capabilities

Naftiko 0.5 capability definitions for Green Thumb Industries - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Reviews access at GTI via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at GTI via Okta, IAM, and Jira."
  tags:
    - security
    - access-management
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review
          description: "Review access at GTI."
          inputParameters:
            - name: dept
              in: body
              type: string
              description: "Department."
          steps:
            - name: ent
              type: call
              call: "okta.get-users"
              with:
                dept: "{{dept}}"
            - name: compare
              type: call
              call: "iam.compare"
              with:
                data: "{{ent.data}}"
            - name: flag
              type: call
              call: "iam.flag"
              with:
                violations: "{{compare.violations}}"
            - name: fix
              type: call
              call: "jira.create-issue"
              with:
                project: "IAM"
                summary: "Violations in {{dept}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gtigrows.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: iam
      baseUri: "https://iam.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iam_token"
      resources:
        - name: reviews
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Manages API deprecation at GTI via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at GTI via consumer identification, notices, and tracking."
  tags:
    - api-management
    - communications
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-sunset
      port: 8080
      tools:
        - name: notify-sunset
          description: "Manage API sunset at GTI."
          inputParameters:
            - name: api
              in: body
              type: string
              description: "API name."
            - name: date
              in: body
              type: string
              description: "Sunset date."
          steps:
            - name: consumers
              type: call
              call: "api-gw.consumers"
              with:
                api: "{{api}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{consumers.emails}}"
                subject: "{{api}} sunset: {{date}}"
            - name: track
              type: call
              call: "analytics.usage"
              with:
                api: "{{api}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Sunset {{api}} by {{date}}"
  consumes:
    - type: http
      namespace: api-gw
      baseUri: "https://api-gw.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.api_gw_token"
      resources:
        - name: consumers
          path: "/apis/{{api}}/consumers"
          inputParameters:
            - name: api
              in: path
          operations:
            - name: consumers
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: usage
          path: "/api-usage"
          operations:
            - name: usage
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks ArgoCD sync at GTI.

naftiko: "0.5"
info:
  label: "ArgoCD Sync Status"
  description: "Checks ArgoCD sync at GTI."
  tags:
    - devops
    - argocd
    - gitops
capability:
  exposes:
    - type: mcp
      namespace: argocd
      port: 8080
      tools:
        - name: check-sync
          description: "Check ArgoCD at GTI."
          inputParameters:
            - name: app
              in: body
              type: string
              description: "App name."
          call: "argocd.get-app"
          with:
            name: "{{app}}"
          outputParameters:
            - name: sync
              type: string
              mapping: "$.status.sync.status"
  consumes:
    - type: http
      namespace: argocd
      baseUri: "https://argocd.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.argocd_token"
      resources:
        - name: apps
          path: "/applications/{{name}}"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: get-app
              method: GET

Checks S3 bucket at GTI.

naftiko: "0.5"
info:
  label: "S3 Bucket Stats"
  description: "Checks S3 bucket at GTI."
  tags:
    - storage
    - aws
    - s3
capability:
  exposes:
    - type: mcp
      namespace: s3-stats
      port: 8080
      tools:
        - name: get-bucket
          description: "Get bucket stats at GTI."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "Bucket."
          call: "s3.get-stats"
          with:
            bucket: "{{bucket}}"
          outputParameters:
            - name: objects
              type: number
              mapping: "$.NumberOfObjects"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: buckets
          path: "/{{bucket}}?metrics"
          inputParameters:
            - name: bucket
              in: path
          operations:
            - name: get-stats
              method: GET

Checks build at GTI.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at GTI."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at GTI."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          call: "azdo.get-build"
          with:
            project: "{{project}}"
            build_id: "{{build_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/gtigrows.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET

Checks Azure resource at GTI.

naftiko: "0.5"
info:
  label: "Azure Resource Health"
  description: "Checks Azure resource at GTI."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: az-health
      port: 8080
      tools:
        - name: check-resource
          description: "Check resource at GTI."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Resource ID."
          call: "azure.get-health"
          with:
            id: "{{resource_id}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.properties.availabilityState"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: health
          path: "/{{id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-health
              method: GET

Verifies backups at GTI.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at GTI."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at GTI."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Analyzes budget variance at GTI via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at GTI via Oracle, Workday, and Slack."
  tags:
    - finance
    - budget
    - oracle
    - workday
capability:
  exposes:
    - type: mcp
      namespace: budget-var
      port: 8080
      tools:
        - name: analyze-variance
          description: "Check budget variance at GTI."
          inputParameters:
            - name: cc
              in: body
              type: string
              description: "Cost center."
            - name: period
              in: body
              type: string
              description: "Period."
          steps:
            - name: actuals
              type: call
              call: "oracle.get-actuals"
              with:
                cc: "{{cc}}"
                period: "{{period}}"
            - name: budget
              type: call
              call: "workday.get-budget"
              with:
                cc: "{{cc}}"
            - name: compute
              type: call
              call: "analytics.variance"
              with:
                a: "{{actuals.total}}"
                b: "{{budget.total}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Variance {{cc}}: ${{compute.variance}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/actuals"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/budgets"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Plans capacity at GTI by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at GTI by collecting utilization and forecasting."
  tags:
    - infrastructure
    - capacity-planning
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: capacity
      port: 8080
      tools:
        - name: plan-capacity
          description: "Plan capacity at GTI."
          inputParameters:
            - name: resource
              in: body
              type: string
              description: "Resource type."
            - name: months
              in: body
              type: number
              description: "Forecast months."
          steps:
            - name: util
              type: call
              call: "monitoring.get-util"
              with:
                resource: "{{resource}}"
            - name: forecast
              type: call
              call: "analytics.forecast"
              with:
                current: "{{util.pct}}"
                months: "{{months}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "capacity"
                resource: "{{resource}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "capacity"
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: util
          path: "/resources/{{resource}}/util"
          inputParameters:
            - name: resource
              in: path
          operations:
            - name: get-util
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: forecast
          path: "/demand"
          operations:
            - name: forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at GTI.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at GTI."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at GTI."
          inputParameters:
            - name: domains
              in: body
              type: string
              description: "Domains to check."
          steps:
            - name: scan
              type: call
              call: "cert-scanner.scan"
              with:
                domains: "{{domains}}"
            - name: filter
              type: call
              call: "analytics.filter-expiring"
              with:
                certs: "{{scan.results}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "{{filter.count}} certs expiring"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Cert alert: {{filter.count}} expiring"
  consumes:
    - type: http
      namespace: cert-scanner
      baseUri: "https://certs.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cert_token"
      resources:
        - name: scans
          path: "/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes changes at GTI through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at GTI through ServiceNow and CAB approval."
  tags:
    - change-management
    - servicenow
    - itil
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: process-change
          description: "Process changes at GTI."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "Change ID."
            - name: date
              in: body
              type: string
              description: "Date."
          steps:
            - name: get
              type: call
              call: "servicenow.get-change"
              with:
                id: "{{change_id}}"
            - name: conflicts
              type: call
              call: "servicenow.check-conflicts"
              with:
                date: "{{date}}"
            - name: submit
              type: call
              call: "servicenow.update"
              with:
                id: "{{change_id}}"
                state: "approval"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "cab@co.com"
                subject: "CAB: {{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Optimizes cloud costs at GTI via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at GTI via Azure, FinOps, Jira, and Power BI."
  tags:
    - cloud
    - cost-management
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-opt
      port: 8080
      tools:
        - name: optimize
          description: "Optimize cloud costs at GTI."
          inputParameters:
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: range
              in: body
              type: string
              description: "Range."
          steps:
            - name: spend
              type: call
              call: "cloud.get-costs"
              with:
                provider: "{{provider}}"
                range: "{{range}}"
            - name: savings
              type: call
              call: "finops.analyze"
              with:
                data: "{{spend.data}}"
            - name: action
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Save ${{savings.potential}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cloud"
  consumes:
    - type: http
      namespace: cloud
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-costs
              method: POST
    - type: http
      namespace: finops
      baseUri: "https://finops.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finops_token"
      resources:
        - name: analysis
          path: "/savings"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Checks CloudWatch alarm at GTI.

naftiko: "0.5"
info:
  label: "CloudWatch Alarm Check"
  description: "Checks CloudWatch alarm at GTI."
  tags:
    - monitoring
    - aws
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: cw-alarm
      port: 8080
      tools:
        - name: check-alarm
          description: "Check alarm at GTI."
          inputParameters:
            - name: alarm
              in: body
              type: string
              description: "Alarm name."
          call: "cw.describe-alarm"
          with:
            alarm: "{{alarm}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.MetricAlarms[0].StateValue"
  consumes:
    - type: http
      namespace: cw
      baseUri: "https://monitoring.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: alarms
          path: "/"
          operations:
            - name: describe-alarm
              method: GET

Searches Confluence at GTI.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at GTI."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at GTI."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gtigrows.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

Searches Green Thumb's Confluence for SOPs, compliance guides, and cultivation procedures by keyword.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Search"
  description: "Searches Green Thumb's Confluence for SOPs, compliance guides, and cultivation procedures by keyword."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: search-kb
          description: "Search Confluence by keyword. Returns matching pages with titles and URLs."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keyword."
          call: "confluence.search"
          with:
            cql: "text~\"{{query}}\""
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gti.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search
              method: GET

Tracks contract renewals at GTI via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at GTI via contracts system, email, Jira, and Salesforce."
  tags:
    - procurement
    - contracts
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renew
      port: 8080
      tools:
        - name: track
          description: "Track renewals at GTI."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
            - name: owner
              in: body
              type: string
              description: "Owner email."
          steps:
            - name: get
              type: call
              call: "contracts.get"
              with:
                id: "{{contract_id}}"
            - name: remind
              type: call
              call: "email.send"
              with:
                to: "{{owner}}"
                subject: "Renewal: {{contract_id}}"
            - name: task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Renew {{contract_id}}"
            - name: crm
              type: call
              call: "salesforce.update"
              with:
                id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: contracts
      baseUri: "https://contracts.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.contracts_token"
      resources:
        - name: contracts
          path: "/contracts/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gtigrows.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Checks Cosmos DB at GTI.

naftiko: "0.5"
info:
  label: "Cosmos DB Metrics"
  description: "Checks Cosmos DB at GTI."
  tags:
    - database
    - azure
    - cosmos-db
capability:
  exposes:
    - type: mcp
      namespace: cosmos
      port: 8080
      tools:
        - name: check-metrics
          description: "Check Cosmos at GTI."
          inputParameters:
            - name: account
              in: body
              type: string
              description: "Account."
          call: "cosmos.metrics"
          with:
            account: "{{account}}"
          outputParameters:
            - name: ru_avg
              type: number
              mapping: "$.value[0].average"
  consumes:
    - type: http
      namespace: cosmos
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: metrics
          path: "/providers/Microsoft.DocumentDB/databaseAccounts/{{account}}/metrics"
          inputParameters:
            - name: account
              in: path
          operations:
            - name: metrics
              method: GET

Reallocates costs at GTI.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at GTI."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at GTI."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When environmental sensors detect out-of-range conditions via Azure IoT, creates a ServiceNow incident, adjusts HVAC parameters, and alerts the cultivation team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cultivation Environment Monitoring Alert"
  description: "When environmental sensors detect out-of-range conditions via Azure IoT, creates a ServiceNow incident, adjusts HVAC parameters, and alerts the cultivation team via Microsoft Teams."
  tags:
    - cultivation
    - iot
    - microsoft-azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: env-monitoring
      port: 8080
      tools:
        - name: handle-environment-alert
          description: "Given a facility code, zone, and alert type, create incident and notify the cultivation team."
          inputParameters:
            - name: facility_code
              in: body
              type: string
              description: "The cultivation facility code."
            - name: zone
              in: body
              type: string
              description: "The grow room zone identifier."
            - name: alert_type
              in: body
              type: string
              description: "Type of environmental alert (e.g. temperature, humidity, CO2)."
            - name: current_value
              in: body
              type: number
              description: "The current sensor reading."
            - name: threshold
              in: body
              type: number
              description: "The expected threshold value."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Environment alert: {{alert_type}} in {{facility_code}} Zone {{zone}}"
                priority: "2"
                category: "cultivation"
                description: "{{alert_type}} out of range in {{facility_code}} Zone {{zone}}. Current: {{current_value}}. Threshold: {{threshold}}."
            - name: notify-cultivation
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "cultivation"
                channel_id: "environment-alerts"
                text: "ENV ALERT: {{alert_type}} in {{facility_code}} Zone {{zone}}. Current: {{current_value}} (threshold: {{threshold}}). Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{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 a cultivation batch reaches harvest, logs harvest data in Oracle Cloud, creates a lab testing request in ServiceNow, documents in SharePoint, and notifies the cultivation and quality teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cultivation Harvest Orchestrator"
  description: "When a cultivation batch reaches harvest, logs harvest data in Oracle Cloud, creates a lab testing request in ServiceNow, documents in SharePoint, and notifies the cultivation and quality teams via Microsoft Teams."
  tags:
    - cultivation
    - harvest
    - oracle-cloud
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cultivation-harvest
      port: 8080
      tools:
        - name: process-harvest
          description: "Given a batch ID, harvest weight, and facility code, log the harvest, request lab testing, document, and notify teams."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch ID."
            - name: harvest_weight_grams
              in: body
              type: number
              description: "Total harvest weight in grams."
            - name: facility_code
              in: body
              type: string
              description: "The cultivation facility code."
            - name: strain
              in: body
              type: string
              description: "The cannabis strain name."
          steps:
            - name: log-harvest
              type: call
              call: "oracle-cloud.update-batch"
              with:
                batch_id: "{{batch_id}}"
                status: "harvested"
                weight: "{{harvest_weight_grams}}"
            - name: request-lab-test
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Lab testing: Batch {{batch_id}} — {{strain}}"
                assigned_group: "Quality_Lab"
                description: "Batch {{batch_id}} ({{strain}}) harvested at {{facility_code}}. Weight: {{harvest_weight_grams}}g. Requires potency and contaminant testing."
            - name: document-harvest
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "cultivation-records"
                folder_path: "Harvests/{{facility_code}}/{{batch_id}}"
            - name: notify-teams
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "cultivation"
                channel_id: "harvests"
                text: "Harvest complete: Batch {{batch_id}} ({{strain}}) at {{facility_code}}. Weight: {{harvest_weight_grams}}g. Lab testing requested: {{request-lab-test.number}}. Docs: {{document-harvest.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: batches
          path: "/lotBatches/{{batch_id}}"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: update-batch
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a customer reaches a new loyalty tier, updates their profile in Salesforce, sends a congratulatory email via MailChimp, and notifies dispensary managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Loyalty Tier Update"
  description: "When a customer reaches a new loyalty tier, updates their profile in Salesforce, sends a congratulatory email via MailChimp, and notifies dispensary managers via Microsoft Teams."
  tags:
    - dispensary
    - loyalty
    - salesforce
    - mailchimp
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: update-loyalty-tier
          description: "Given a customer ID and new tier, update Salesforce, email the customer, and notify managers."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Salesforce contact ID."
            - name: new_tier
              in: body
              type: string
              description: "The new loyalty tier."
            - name: customer_email
              in: body
              type: string
              description: "The customer email."
          steps:
            - name: update-salesforce
              type: call
              call: "salesforce.update-contact"
              with:
                contact_id: "{{customer_id}}"
                loyalty_tier: "{{new_tier}}"
            - name: send-email
              type: call
              call: "mailchimp.send-transactional"
              with:
                to_email: "{{customer_email}}"
                template: "loyalty_upgrade"
                merge_vars:
                  tier: "{{new_tier}}"
            - name: notify-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "dispensary-ops"
                channel_id: "loyalty"
                text: "Customer {{customer_id}} upgraded to {{new_tier}} tier."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gti.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: update-contact
              method: PATCH
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_api_key"
      resources:
        - name: transactional
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              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

Monitors data pipelines at GTI via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at GTI via Databricks, Snowflake, Slack, and ServiceNow."
  tags:
    - data-engineering
    - databricks
    - monitoring
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pipeline-mon
      port: 8080
      tools:
        - name: monitor
          description: "Monitor pipelines at GTI."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          steps:
            - name: status
              type: call
              call: "databricks.get-run"
              with:
                id: "{{pipeline_id}}"
            - name: quality
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#data"
                text: "Pipeline {{pipeline_id}}: {{status.state}}"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "Pipeline {{pipeline_id}} issue"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://gtigrows.com.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Manages data retention at GTI.

naftiko: "0.5"
info:
  label: "Data Retention Pipeline"
  description: "Manages data retention at GTI."
  tags:
    - data-governance
    - compliance
    - retention
capability:
  exposes:
    - type: mcp
      namespace: retention
      port: 8080
      tools:
        - name: cleanup
          description: "Manage retention at GTI."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy ID."
          steps:
            - name: find
              type: call
              call: "catalog.find-expired"
              with:
                policy: "{{policy}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                records: "{{find.ids}}"
            - name: delete
              type: call
              call: "db.delete"
              with:
                ids: "{{find.ids}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO retention_log VALUES ('{{policy}}',{{find.count}})"
  consumes:
    - type: http
      namespace: catalog
      baseUri: "https://catalog.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.catalog_token"
      resources:
        - name: policies
          path: "/expired"
          operations:
            - name: find-expired
              method: GET
    - type: http
      namespace: storage
      baseUri: "https://storage.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST
    - type: http
      namespace: db
      baseUri: "https://db.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.db_token"
      resources:
        - name: records
          path: "/delete"
          operations:
            - name: delete
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST

Checks Datadog monitor at GTI.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at GTI."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at GTI."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Triggers a dispensary compliance check by pulling the location profile from Oracle Cloud, querying open compliance tickets in ServiceNow, generating an audit report in SharePoint, and notifying the compliance team.

naftiko: "0.5"
info:
  label: "Dispensary Compliance Audit Orchestrator"
  description: "Triggers a dispensary compliance check by pulling the location profile from Oracle Cloud, querying open compliance tickets in ServiceNow, generating an audit report in SharePoint, and notifying the compliance team."
  tags:
    - compliance
    - dispensary
    - audit
    - oracle-cloud
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dispensary-compliance
      port: 8080
      tools:
        - name: run-compliance-audit
          description: "Given a dispensary location code and audit type, pull the profile, check tickets, generate report, and notify."
          inputParameters:
            - name: location_code
              in: body
              type: string
              description: "The dispensary location code."
            - name: audit_type
              in: body
              type: string
              description: "Type of compliance audit (e.g. state-inspection, internal-review, safety)."
          steps:
            - name: get-location
              type: call
              call: "oracle-cloud.get-location"
              with:
                location_code: "{{location_code}}"
            - name: get-open-tickets
              type: call
              call: "servicenow.query-tasks"
              with:
                query: "location={{location_code}}^category={{audit_type}}^stateNOT IN6,7"
            - name: create-audit-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance-audits"
                folder_path: "Dispensary/{{location_code}}/{{audit_type}}"
                content: "Location: {{get-location.name}}. Open issues: {{get-open-tickets.count}}. Audit: {{audit_type}}."
            - name: notify-compliance
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "compliance"
                channel_id: "dispensary-audits"
                text: "Compliance audit: {{get-location.name}} ({{location_code}}). Type: {{audit_type}}. Open issues: {{get-open-tickets.count}}. Report: {{create-audit-report.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: locations
          path: "/locations/{{location_code}}"
          inputParameters:
            - name: location_code
              in: path
          operations:
            - name: get-location
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gti.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: query-tasks
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries product inventory levels from Oracle Cloud for a given SKU across Green Thumb dispensary locations, returning on-hand quantity, reserved stock, and low-stock alerts.

naftiko: "0.5"
info:
  label: "Dispensary Product Inventory Check"
  description: "Queries product inventory levels from Oracle Cloud for a given SKU across Green Thumb dispensary locations, returning on-hand quantity, reserved stock, and low-stock alerts."
  tags:
    - dispensary
    - inventory
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: dispensary-inventory
      port: 8080
      tools:
        - name: check-product-inventory
          description: "Given a product SKU and optional location, return current inventory quantity and availability."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "The product SKU."
            - name: location_code
              in: body
              type: string
              description: "Optional dispensary location code."
          call: "oracle-cloud.get-inventory"
          with:
            sku: "{{sku}}"
            location_code: "{{location_code}}"
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: inventory
          path: "/inventoryBalances?q=ItemNumber={{sku}};LocationCode={{location_code}}"
          inputParameters:
            - name: sku
              in: query
            - name: location_code
              in: query
          operations:
            - name: get-inventory
              method: GET

Checks container at GTI.

naftiko: "0.5"
info:
  label: "Docker Container Check"
  description: "Checks container at GTI."
  tags:
    - containers
    - docker
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: docker
      port: 8080
      tools:
        - name: check-container
          description: "Check container at GTI."
          inputParameters:
            - name: id
              in: body
              type: string
              description: "Container ID."
          call: "docker.get-container"
          with:
            id: "{{id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.State.Status"
  consumes:
    - type: http
      namespace: docker
      baseUri: "https://docker.gtigrows.com/v1.41"
      authentication:
        type: bearer
        token: "$secrets.docker_token"
      resources:
        - name: containers
          path: "/containers/{{id}}/json"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-container
              method: GET

Tests disaster recovery at GTI via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at GTI via failover, health checks, and reporting."
  tags:
    - disaster-recovery
    - business-continuity
    - testing
capability:
  exposes:
    - type: mcp
      namespace: dr-test
      port: 8080
      tools:
        - name: test-dr
          description: "Test DR at GTI."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Plan ID."
            - name: type
              in: body
              type: string
              description: "Test type."
          steps:
            - name: failover
              type: call
              call: "dr.failover"
              with:
                plan: "{{plan_id}}"
                type: "{{type}}"
            - name: validate
              type: call
              call: "monitoring.check"
              with:
                scope: "critical"
            - name: measure
              type: call
              call: "dr.metrics"
              with:
                id: "{{failover.id}}"
            - name: report
              type: call
              call: "confluence.create-page"
              with:
                title: "DR - {{plan_id}}"
                body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
  consumes:
    - type: http
      namespace: dr
      baseUri: "https://dr.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dr_token"
      resources:
        - name: failovers
          path: "/failovers"
          operations:
            - name: failover
              method: POST
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: health
          path: "/checks"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gtigrows.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Detects infrastructure drift at GTI via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at GTI via Terraform, Slack, and Jira."
  tags:
    - infrastructure
    - terraform
    - drift-detection
    - devops
capability:
  exposes:
    - type: mcp
      namespace: drift-det
      port: 8080
      tools:
        - name: detect
          description: "Detect drift at GTI."
          inputParameters:
            - name: ws_id
              in: body
              type: string
              description: "Workspace ID."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: plan
              type: call
              call: "terraform.run"
              with:
                ws: "{{ws_id}}"
            - name: check
              type: call
              call: "terraform.get-plan"
              with:
                run: "{{plan.id}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra"
                text: "Drift {{env}}: {{check.changes}} changes"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Drift in {{env}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks Dynatrace host at GTI.

naftiko: "0.5"
info:
  label: "Dynatrace Host Status"
  description: "Checks Dynatrace host at GTI."
  tags:
    - monitoring
    - dynatrace
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: dt
      port: 8080
      tools:
        - name: check-host
          description: "Check host at GTI."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "Host ID."
          call: "dt.get-host"
          with:
            id: "{{host_id}}"
          outputParameters:
            - name: availability
              type: string
              mapping: "$.availabilityState"
  consumes:
    - type: http
      namespace: dt
      baseUri: "https://gtigrows.com.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-host
              method: GET

Checks ES index at GTI.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at GTI."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at GTI."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.gtigrows.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Offboards employees at GTI via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at GTI via Okta, Slack, ServiceNow, and storage."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: offboard
          description: "Offboard employees at GTI."
          inputParameters:
            - name: emp_id
              in: body
              type: string
              description: "Employee ID."
            - name: last_day
              in: body
              type: string
              description: "Last day."
          steps:
            - name: disable
              type: call
              call: "okta.deactivate"
              with:
                user: "{{emp_id}}"
            - name: revoke
              type: call
              call: "slack.remove"
              with:
                user: "{{emp_id}}"
            - name: return
              type: call
              call: "servicenow.create-request"
              with:
                type: "return"
                emp: "{{emp_id}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                user: "{{emp_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gtigrows.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user}}/lifecycle/deactivate"
          inputParameters:
            - name: user
              in: path
          operations:
            - name: deactivate
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.remove"
          operations:
            - name: remove
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: storage
      baseUri: "https://storage.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

On new hire in Workday, creates a ServiceNow onboarding ticket, provisions a SharePoint training folder, assigns compliance training via Pluralsight, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire in Workday, creates a ServiceNow onboarding ticket, provisions a SharePoint training folder, assigns compliance training via Pluralsight, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - pluralsight
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Given a Workday worker ID and start date, create IT ticket, training folder, assign learning, and send welcome."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "Department the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboard {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr-onboarding"
                folder_path: "NewHires/{{get-employee.full_name}}_{{start_date}}"
            - name: assign-training
              type: call
              call: "pluralsight.assign-path"
              with:
                user_email: "{{get-employee.work_email}}"
                path_id: "cannabis-compliance-101"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Green Thumb Industries, {{get-employee.first_name}}! IT ticket: {{open-ticket.number}}. Training: {{provision-folder.url}}. Compliance course: {{assign-training.path_url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: assignments
          path: "/learning-paths/{{path_id}}/assignments"
          inputParameters:
            - name: path_id
              in: path
          operations:
            - name: assign-path
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Generates ESG reports at GTI.

naftiko: "0.5"
info:
  label: "ESG Report Pipeline"
  description: "Generates ESG reports at GTI."
  tags:
    - sustainability
    - esg
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: esg
      port: 8080
      tools:
        - name: gen-report
          description: "Generate ESG report at GTI."
          inputParameters:
            - name: year
              in: body
              type: string
              description: "Year."
          steps:
            - name: data
              type: call
              call: "platform.get-environmental"
              with:
                year: "{{year}}"
            - name: compute
              type: call
              call: "analytics.compute-esg"
              with:
                data: "{{data.metrics}}"
            - name: generate
              type: call
              call: "docs.create-report"
              with:
                template: "esg"
            - name: publish
              type: call
              call: "sharepoint.upload"
              with:
                path: "/ESG/{{year}}/report.pdf"
  consumes:
    - type: http
      namespace: platform
      baseUri: "https://data.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: environmental
          path: "/metrics"
          operations:
            - name: get-environmental
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: esg
          path: "/compute"
          operations:
            - name: compute-esg
              method: POST
    - type: http
      namespace: docs
      baseUri: "https://docs.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.docs_token"
      resources:
        - name: reports
          path: "/create"
          operations:
            - name: create-report
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/root/drive/root:/{{path}}:/content"
          operations:
            - name: upload
              method: PUT

Audits expenses at GTI via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at GTI via Concur, compliance checks, and email."
  tags:
    - finance
    - travel
    - sap-concur
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit
          description: "Audit expenses at GTI."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Report ID."
          steps:
            - name: get
              type: call
              call: "concur.get-report"
              with:
                id: "{{report_id}}"
            - name: check
              type: call
              call: "compliance.check"
              with:
                expenses: "{{get.entries}}"
            - name: flag
              type: call
              call: "workflow.flag"
              with:
                id: "{{report_id}}"
                violations: "{{check.violations}}"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "{{get.approver}}"
                subject: "Expense {{report_id}} violations"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: policies
          path: "/check"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: reviews
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Analyzes feedback at GTI via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at GTI via surveys, AI sentiment, and Power BI."
  tags:
    - customer-experience
    - analytics
    - sentiment-analysis
capability:
  exposes:
    - type: mcp
      namespace: feedback
      port: 8080
      tools:
        - name: analyze
          description: "Analyze feedback at GTI."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "Survey ID."
          steps:
            - name: collect
              type: call
              call: "survey.get"
              with:
                id: "{{survey_id}}"
            - name: sentiment
              type: call
              call: "ai.analyze"
              with:
                text: "{{collect.responses}}"
            - name: themes
              type: call
              call: "ai.themes"
              with:
                data: "{{collect.responses}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cx"
  consumes:
    - type: http
      namespace: survey
      baseUri: "https://surveys.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Checks GitHub repo at GTI.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at GTI."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at GTI."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo."
            - name: branch
              in: body
              type: string
              description: "Branch."
          call: "github.get-branch"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
          outputParameters:
            - name: sha
              type: string
              mapping: "$.commit.sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/org/{{repo}}/branches/{{branch}}"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch
              method: GET

Pulls daily web traffic metrics from Google Analytics for GTI dispensary websites including sessions, page views, and conversion to online order.

naftiko: "0.5"
info:
  label: "Google Analytics Dispensary Web Traffic"
  description: "Pulls daily web traffic metrics from Google Analytics for GTI dispensary websites including sessions, page views, and conversion to online order."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-web-traffic
          description: "Retrieve daily web traffic from Google Analytics for a date range."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "google-analytics.run-report"
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Checks Google user at GTI.

naftiko: "0.5"
info:
  label: "Google Workspace User Check"
  description: "Checks Google user at GTI."
  tags:
    - identity
    - google-workspace
    - directory
capability:
  exposes:
    - type: mcp
      namespace: gws
      port: 8080
      tools:
        - name: check-user
          description: "Check user at GTI."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "google.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: suspended
              type: boolean
              mapping: "$.suspended"
  consumes:
    - type: http
      namespace: google
      baseUri: "https://admin.googleapis.com/admin/directory/v1"
      authentication:
        type: bearer
        token: "$secrets.google_admin_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Checks Grafana dashboard at GTI.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at GTI."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at GTI."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.gtigrows.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

Auto-routes tickets at GTI.

naftiko: "0.5"
info:
  label: "Helpdesk Auto-Routing Pipeline"
  description: "Auto-routes tickets at GTI."
  tags:
    - support
    - helpdesk
    - ai
    - automation
capability:
  exposes:
    - type: mcp
      namespace: ticket-route
      port: 8080
      tools:
        - name: route-ticket
          description: "Auto-route tickets at GTI."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Ticket ID."
          steps:
            - name: get
              type: call
              call: "helpdesk.get-ticket"
              with:
                id: "{{ticket_id}}"
            - name: classify
              type: call
              call: "ai.classify"
              with:
                subject: "{{get.subject}}"
                body: "{{get.body}}"
            - name: assign
              type: call
              call: "helpdesk.assign"
              with:
                id: "{{ticket_id}}"
                team: "{{classify.team}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#{{classify.team}}"
                text: "New: {{get.subject}} ({{classify.priority}})"
  consumes:
    - type: http
      namespace: helpdesk
      baseUri: "https://helpdesk.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.helpdesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-ticket
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: classify
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches Instagram account metrics for GTI dispensary brands including follower count, engagement rate, and recent post performance.

naftiko: "0.5"
info:
  label: "Instagram Social Metrics"
  description: "Fetches Instagram account metrics for GTI dispensary brands including follower count, engagement rate, and recent post performance."
  tags:
    - marketing
    - social-media
    - instagram
    - meta
capability:
  exposes:
    - type: mcp
      namespace: social-marketing
      port: 8080
      tools:
        - name: get-instagram-metrics
          description: "Retrieve Instagram account metrics. Returns followers, engagement, and recent post data."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Instagram business account ID."
          call: "meta.get-ig-insights"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: ig-insights
          path: "/{{account_id}}/insights"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-ig-insights
              method: GET

Escalates IT incidents at GTI via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at GTI via ServiceNow, PagerDuty, and Slack."
  tags:
    - incident-management
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate incidents at GTI."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: page
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{get-incident.description}}"
                urgency: "{{severity}}"
            - name: channel
              type: call
              call: "slack.create-channel"
              with:
                name: "inc-{{incident_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#inc-{{incident_id}}"
                text: "P{{severity}}: {{get-incident.description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Checks Jenkins at GTI.

naftiko: "0.5"
info:
  label: "Jenkins Build Check"
  description: "Checks Jenkins at GTI."
  tags:
    - devops
    - jenkins
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: jenkins
      port: 8080
      tools:
        - name: check-build
          description: "Check Jenkins at GTI."
          inputParameters:
            - name: job
              in: body
              type: string
              description: "Job."
            - name: build
              in: body
              type: string
              description: "Build number."
          call: "jenkins.get-build"
          with:
            job: "{{job}}"
            build: "{{build}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: jenkins
      baseUri: "https://jenkins.gtigrows.com"
      authentication:
        type: bearer
        token: "$secrets.jenkins_token"
      resources:
        - name: builds
          path: "/job/{{job}}/{{build}}/api/json"
          inputParameters:
            - name: job
              in: path
            - name: build
              in: path
          operations:
            - name: get-build
              method: GET

Retrieves sprint progress at GTI.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at GTI."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at GTI."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Project key."
          call: "jira.get-sprints"
          with:
            project: "{{project_key}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/1/sprint"
          operations:
            - name: get-sprints
              method: GET

Retrieves a Jira task by issue key, returning summary, status, assignee, and priority for project management tracking.

naftiko: "0.5"
info:
  label: "Jira Task Status"
  description: "Retrieves a Jira task by issue key, returning summary, status, assignee, and priority for project management tracking."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: projects
      port: 8080
      tools:
        - name: get-task
          description: "Look up a Jira issue by key."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://gti.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Maintains KB at GTI by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at GTI by finding stale articles and notifying owners."
  tags:
    - knowledge-management
    - confluence
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: kb-maint
      port: 8080
      tools:
        - name: maintain-kb
          description: "Maintain KB at GTI."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "Confluence space."
            - name: stale_days
              in: body
              type: number
              description: "Days threshold."
          steps:
            - name: find
              type: call
              call: "confluence.search-stale"
              with:
                space: "{{space}}"
                days: "{{stale_days}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{find.owners}}"
                subject: "KB review needed"
            - name: flag
              type: call
              call: "confluence.add-label"
              with:
                pages: "{{find.ids}}"
                label: "needs-review"
            - name: report
              type: call
              call: "slack.post-message"
              with:
                channel: "#kb"
                text: "KB: {{find.count}} stale articles"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://gtigrows.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search-stale
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Key Vault secret at GTI.

naftiko: "0.5"
info:
  label: "Key Vault Secret Expiry"
  description: "Checks Key Vault secret at GTI."
  tags:
    - security
    - azure
    - key-vault
capability:
  exposes:
    - type: mcp
      namespace: akv
      port: 8080
      tools:
        - name: check-expiry
          description: "Check secret at GTI."
          inputParameters:
            - name: vault
              in: body
              type: string
              description: "Vault."
            - name: secret
              in: body
              type: string
              description: "Secret."
          call: "akv.get-secret"
          with:
            vault: "{{vault}}"
            secret: "{{secret}}"
          outputParameters:
            - name: expires
              type: string
              mapping: "$.attributes.expires"
  consumes:
    - type: http
      namespace: akv
      baseUri: "https://{{vault}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret}}"
          inputParameters:
            - name: secret
              in: path
          operations:
            - name: get-secret
              method: GET

Generates KPI digest at GTI from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at GTI from Snowflake, Oracle, Power BI, and email."
  tags:
    - reporting
    - kpi
    - snowflake
    - executive
capability:
  exposes:
    - type: mcp
      namespace: kpi-digest
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate KPI digest at GTI."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Week ending."
            - name: dist
              in: body
              type: string
              description: "Distribution list."
          steps:
            - name: ops
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM kpis WHERE w='{{week}}'"
            - name: fin
              type: call
              call: "oracle.get-summary"
              with:
                period: "{{week}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "exec_kpis"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "{{dist}}"
                subject: "KPIs - {{week}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/summary"
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks K8s pod health at GTI.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at GTI."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at GTI."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

When lab results arrive, updates the batch record in Oracle Cloud, creates a compliance log in SharePoint, updates the Salesforce product catalog if approved, and notifies quality and dispensary teams via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Lab Test Results Processing Pipeline"
  description: "When lab results arrive, updates the batch record in Oracle Cloud, creates a compliance log in SharePoint, updates the Salesforce product catalog if approved, and notifies quality and dispensary teams via Microsoft Teams."
  tags:
    - quality
    - lab-testing
    - oracle-cloud
    - sharepoint
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lab-results
      port: 8080
      tools:
        - name: process-lab-results
          description: "Given a batch ID and test results, update the batch, log compliance, update product catalog, and notify teams."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch ID."
            - name: thc_pct
              in: body
              type: number
              description: "THC percentage from lab results."
            - name: cbd_pct
              in: body
              type: number
              description: "CBD percentage from lab results."
            - name: pass_fail
              in: body
              type: string
              description: "Lab test result (pass/fail)."
            - name: contaminants_clear
              in: body
              type: string
              description: "Whether contaminant tests passed (true/false)."
          steps:
            - name: update-batch
              type: call
              call: "oracle-cloud.update-batch"
              with:
                batch_id: "{{batch_id}}"
                thc_pct: "{{thc_pct}}"
                cbd_pct: "{{cbd_pct}}"
                test_result: "{{pass_fail}}"
            - name: log-compliance
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance-records"
                folder_path: "LabResults/{{batch_id}}"
                content: "Batch: {{batch_id}}. THC: {{thc_pct}}%. CBD: {{cbd_pct}}%. Contaminants clear: {{contaminants_clear}}. Result: {{pass_fail}}."
            - name: update-catalog
              type: call
              call: "salesforce.update-product"
              with:
                batch_id: "{{batch_id}}"
                thc_pct: "{{thc_pct}}"
                cbd_pct: "{{cbd_pct}}"
                available: "{{pass_fail}}"
            - name: notify-teams
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "quality"
                channel_id: "lab-results"
                text: "Lab results: Batch {{batch_id}} — {{pass_fail}}. THC: {{thc_pct}}%. CBD: {{cbd_pct}}%. Contaminants: {{contaminants_clear}}. Catalog updated. Compliance logged: {{log-compliance.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: batches
          path: "/lotBatches/{{batch_id}}"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: update-batch
              method: PATCH
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: salesforce
      baseUri: "https://gti.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: products
          path: "/sobjects/Product2"
          operations:
            - name: update-product
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Lambda at GTI.

naftiko: "0.5"
info:
  label: "Lambda Function Check"
  description: "Checks Lambda at GTI."
  tags:
    - serverless
    - aws
    - lambda
capability:
  exposes:
    - type: mcp
      namespace: lambda
      port: 8080
      tools:
        - name: check-fn
          description: "Check Lambda at GTI."
          inputParameters:
            - name: fn
              in: body
              type: string
              description: "Function name."
          call: "lambda.get-fn"
          with:
            name: "{{fn}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.Configuration.State"
  consumes:
    - type: http
      namespace: lambda
      baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: functions
          path: "/functions/{{name}}"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: get-fn
              method: GET

Checks license compliance at GTI via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at GTI via scanning, entitlements, and procurement."
  tags:
    - compliance
    - licensing
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: license-comp
      port: 8080
      tools:
        - name: check-licenses
          description: "Check license compliance at GTI."
          inputParameters:
            - name: software
              in: body
              type: string
              description: "Software."
            - name: vendor
              in: body
              type: string
              description: "Vendor."
          steps:
            - name: scan
              type: call
              call: "assets.installations"
              with:
                sw: "{{software}}"
            - name: entitlements
              type: call
              call: "licenses.get"
              with:
                sw: "{{software}}"
            - name: flag
              type: call
              call: "compliance.flag"
              with:
                installed: "{{scan.count}}"
                entitled: "{{entitlements.count}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "license"
                sw: "{{software}}"
  consumes:
    - type: http
      namespace: assets
      baseUri: "https://assets.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: installations
          path: "/installations"
          operations:
            - name: installations
              method: GET
    - type: http
      namespace: licenses
      baseUri: "https://licenses.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.license_token"
      resources:
        - name: ent
          path: "/entitlements"
          operations:
            - name: get
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: overages
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Retrieves status of a LinkedIn job posting for Green Thumb Industries including views, applicants, and days remaining.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Status"
  description: "Retrieves status of a LinkedIn job posting for Green Thumb Industries including views, applicants, and days remaining."
  tags:
    - recruiting
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: get-job-posting
          description: "Look up a LinkedIn job posting by ID."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "The LinkedIn job posting ID."
          call: "linkedin.get-job"
          with:
            job_id: "{{job_id}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: jobs
          path: "/jobs/{{job_id}}"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: get-job
              method: GET

Retrieves performance metrics for a MailChimp email campaign including open rate, click rate, and unsubscribes for dispensary marketing.

naftiko: "0.5"
info:
  label: "MailChimp Email Campaign Metrics"
  description: "Retrieves performance metrics for a MailChimp email campaign including open rate, click rate, and unsubscribes for dispensary marketing."
  tags:
    - marketing
    - email
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Given a MailChimp campaign ID, return open rate, click rate, and total recipients."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The MailChimp campaign ID."
          call: "mailchimp.get-report"
          with:
            campaign_id: "{{campaign_id}}"
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_api_key"
      resources:
        - name: reports
          path: "/reports/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-report
              method: GET

Tracks marketing campaigns at GTI.

naftiko: "0.5"
info:
  label: "Marketing Campaign Pipeline"
  description: "Tracks marketing campaigns at GTI."
  tags:
    - marketing
    - google-ads
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: track-campaign
          description: "Track campaigns at GTI."
          inputParameters:
            - name: campaign
              in: body
              type: string
              description: "Campaign ID."
          steps:
            - name: ads
              type: call
              call: "google-ads.get"
              with:
                id: "{{campaign}}"
            - name: social
              type: call
              call: "social.get-metrics"
              with:
                campaign: "{{campaign}}"
            - name: compile
              type: call
              call: "analytics.compile"
              with:
                ads: "{{ads.data}}"
                social: "{{social.data}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "marketing"
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v14"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: social
      baseUri: "https://social.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.social_token"
      resources:
        - name: metrics
          path: "/campaigns/{{campaign}}"
          inputParameters:
            - name: campaign
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: marketing
          path: "/compile"
          operations:
            - name: compile
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Sends a notification message to a Microsoft Teams channel for operational alerts, compliance updates, or cultivation notifications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Notification"
  description: "Sends a notification message to a Microsoft Teams channel for operational alerts, compliance updates, or cultivation notifications."
  tags:
    - communications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: notifications
      port: 8080
      tools:
        - name: send-alert
          description: "Post a message to a Microsoft Teams channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The Teams channel ID."
            - name: message
              in: body
              type: string
              description: "The notification message."
          call: "msteams.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks MongoDB at GTI.

naftiko: "0.5"
info:
  label: "MongoDB Stats Check"
  description: "Checks MongoDB at GTI."
  tags:
    - database
    - mongodb
    - operations
capability:
  exposes:
    - type: mcp
      namespace: mongo
      port: 8080
      tools:
        - name: get-stats
          description: "Check MongoDB at GTI."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: collection
              in: body
              type: string
              description: "Collection."
          call: "mongo.get-stats"
          with:
            db: "{{db}}"
            collection: "{{collection}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.count"
  consumes:
    - type: http
      namespace: mongo
      baseUri: "https://mongo.gtigrows.com/api/atlas/v1.0"
      authentication:
        type: bearer
        token: "$secrets.mongo_token"
      resources:
        - name: collections
          path: "/collStats"
          operations:
            - name: get-stats
              method: GET

Generates monthly security reports at GTI from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at GTI from Splunk and Qualys."
  tags:
    - security
    - reporting
    - splunk
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-report
      port: 8080
      tools:
        - name: gen-sec-report
          description: "Generate security report at GTI."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "Month."
          steps:
            - name: splunk
              type: call
              call: "splunk.search"
              with:
                query: "index=security earliest=-30d"
            - name: scans
              type: call
              call: "qualys.results"
              with:
                month: "{{month}}"
            - name: compile
              type: call
              call: "analytics.compile-security"
              with:
                events: "{{splunk.count}}"
                vulns: "{{scans.critical}}"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "ciso@co.com"
                subject: "Security - {{month}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.gtigrows.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: results
          path: "/fo/scan/results"
          operations:
            - name: results
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: security
          path: "/compile"
          operations:
            - name: compile-security
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Coordinates a new dispensary location launch by verifying inventory in Oracle Cloud, scheduling a marketing email in MailChimp, posting on Instagram via Meta, creating a compliance checklist in ServiceNow, and notifying cross-functional teams in Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Dispensary Opening Orchestrator"
  description: "Coordinates a new dispensary location launch by verifying inventory in Oracle Cloud, scheduling a marketing email in MailChimp, posting on Instagram via Meta, creating a compliance checklist in ServiceNow, and notifying cross-functional teams in Microsoft Teams."
  tags:
    - dispensary
    - launch
    - oracle-cloud
    - mailchimp
    - meta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dispensary-launch
      port: 8080
      tools:
        - name: launch-dispensary
          description: "Given a location code and launch date, verify inventory, schedule email, post social, create compliance task, and notify teams."
          inputParameters:
            - name: location_code
              in: body
              type: string
              description: "The new dispensary location code."
            - name: launch_date
              in: body
              type: string
              description: "Launch date in YYYY-MM-DD format."
            - name: location_name
              in: body
              type: string
              description: "The dispensary location name."
          steps:
            - name: verify-inventory
              type: call
              call: "oracle-cloud.get-location-inventory"
              with:
                location_code: "{{location_code}}"
            - name: schedule-email
              type: call
              call: "mailchimp.schedule-campaign"
              with:
                subject: "Grand Opening: {{location_name}} — Visit Us {{launch_date}}!"
                schedule_time: "{{launch_date}}T09:00:00Z"
            - name: post-social
              type: call
              call: "meta.create-post"
              with:
                message: "We're thrilled to announce our new {{location_name}} location opening {{launch_date}}! Come visit us."
            - name: create-compliance-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "New dispensary compliance: {{location_name}}"
                assigned_group: "Compliance_Operations"
                description: "Verify all state and local compliance requirements for {{location_name}} ({{location_code}}) opening {{launch_date}}."
            - name: notify-teams
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "operations"
                channel_id: "dispensary-launches"
                text: "Dispensary launch: {{location_name}} ({{location_code}}) on {{launch_date}}. Inventory: {{verify-inventory.total_skus}} SKUs ready. Email scheduled. Social posted. Compliance task: {{create-compliance-task.number}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: location-inventory
          path: "/inventoryBalances?q=LocationCode={{location_code}}"
          inputParameters:
            - name: location_code
              in: query
          operations:
            - name: get-location-inventory
              method: GET
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: schedule-campaign
              method: POST
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_token"
      resources:
        - name: posts
          path: "/{{page_id}}/feed"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: create-post
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: 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

Onboards employees at GTI with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at GTI with Okta, ServiceNow, Slack, and calendar."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Onboard employees at GTI."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Name."
            - name: dept
              in: body
              type: string
              description: "Department."
            - name: start
              in: body
              type: string
              description: "Start date."
          steps:
            - name: okta
              type: call
              call: "okta.create-user"
              with:
                name: "{{name}}"
                department: "{{dept}}"
            - name: equip
              type: call
              call: "servicenow.create-request"
              with:
                type: "new_hire"
                for: "{{name}}"
            - name: slack
              type: call
              call: "slack.invite"
              with:
                email: "{{okta.email}}"
            - name: orient
              type: call
              call: "calendar.create-event"
              with:
                title: "Orientation - {{name}}"
                date: "{{start}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gtigrows.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.invite"
          operations:
            - name: invite
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/hr/events"
          operations:
            - name: create-event
              method: POST

Checks New Relic APM at GTI.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at GTI."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at GTI."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Checks NR synthetics at GTI.

naftiko: "0.5"
info:
  label: "New Relic Synthetics Monitor"
  description: "Checks NR synthetics at GTI."
  tags:
    - monitoring
    - new-relic
    - synthetics
capability:
  exposes:
    - type: mcp
      namespace: nr-synth
      port: 8080
      tools:
        - name: check-monitor
          description: "Check synthetics at GTI."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "nr.get-monitor"
          with:
            id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: nr
      baseUri: "https://synthetics.newrelic.com/synthetics/api/v3"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: monitors
          path: "/monitors/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-monitor
              method: GET

Checks Okta user at GTI.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at GTI."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at GTI."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://gtigrows.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves a purchase order from Oracle E-Business Suite by PO number, returning vendor, total value, line items, and delivery status.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Purchase Order"
  description: "Retrieves a purchase order from Oracle E-Business Suite by PO number, returning vendor, total value, line items, and delivery status."
  tags:
    - procurement
    - oracle-e-business-suite
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a purchase order by PO number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The Oracle purchase order number."
          call: "oracle-ebs.get-po"
          with:
            po_number: "{{po_number}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://gti-ebs.oraclecloud.com/webservices/rest/po/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Checks on-call at GTI.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at GTI."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at GTI."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Creates postmortems at GTI.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at GTI."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at GTI."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gtigrows.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Triggers a Power BI dataset refresh for dispensary sales, cultivation, or compliance dashboards.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for dispensary sales, cultivation, or compliance dashboards."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-dashboard
          description: "Trigger a Power BI dataset refresh by dataset ID."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.refresh-dataset"
          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: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Checks Power BI refresh at GTI.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at GTI."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at GTI."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

When a product recall is initiated, identifies affected batches in Oracle Cloud, flags affected dispensary inventory, creates compliance cases in ServiceNow, sends customer notifications via MailChimp, and alerts all locations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Recall Orchestrator"
  description: "When a product recall is initiated, identifies affected batches in Oracle Cloud, flags affected dispensary inventory, creates compliance cases in ServiceNow, sends customer notifications via MailChimp, and alerts all locations via Microsoft Teams."
  tags:
    - compliance
    - recall
    - oracle-cloud
    - servicenow
    - mailchimp
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-recall
      port: 8080
      tools:
        - name: initiate-recall
          description: "Given batch IDs and reason, flag inventory, create compliance cases, notify customers, and alert all locations."
          inputParameters:
            - name: batch_ids
              in: body
              type: string
              description: "Comma-separated batch IDs to recall."
            - name: recall_reason
              in: body
              type: string
              description: "Reason for the product recall."
            - name: severity
              in: body
              type: string
              description: "Recall severity (Class I, II, III)."
          steps:
            - name: flag-inventory
              type: call
              call: "oracle-cloud.quarantine-batches"
              with:
                batch_ids: "{{batch_ids}}"
                reason: "{{recall_reason}}"
            - name: create-compliance-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Product Recall ({{severity}}): {{recall_reason}}"
                priority: "1"
                category: "product_recall"
                assigned_group: "Compliance_Urgent"
                description: "Recall severity: {{severity}}. Reason: {{recall_reason}}. Batches: {{batch_ids}}. Affected locations: {{flag-inventory.affected_locations}}."
            - name: notify-customers
              type: call
              call: "mailchimp.send-campaign"
              with:
                subject: "Important Product Notice from Green Thumb Industries"
                segment: "recent-purchasers"
            - name: alert-locations
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "all-dispensaries"
                channel_id: "urgent-notices"
                text: "PRODUCT RECALL ({{severity}}): {{recall_reason}}. Batches: {{batch_ids}}. Remove from shelves immediately. Compliance case: {{create-compliance-case.number}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: quarantine
          path: "/lotBatches/quarantine"
          operations:
            - name: quarantine-batches
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gti.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: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: bearer
        token: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: send-campaign
              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

Queries Prometheus metrics at GTI.

naftiko: "0.5"
info:
  label: "Prometheus Metrics Query"
  description: "Queries Prometheus metrics at GTI."
  tags:
    - monitoring
    - prometheus
    - metrics
capability:
  exposes:
    - type: mcp
      namespace: prom
      port: 8080
      tools:
        - name: query
          description: "Query Prometheus at GTI."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "PromQL query."
          call: "prometheus.query"
          with:
            query: "{{query}}"
          outputParameters:
            - name: value
              type: number
              mapping: "$.data.result[0].value[1]"
  consumes:
    - type: http
      namespace: prometheus
      baseUri: "https://prometheus.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: queries
          path: "/query"
          operations:
            - name: query
              method: GET

Generates compliance reports at GTI from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at GTI from Snowflake, Power BI, and email."
  tags:
    - compliance
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: compliance-rpt
      port: 8080
      tools:
        - name: gen-report
          description: "Generate compliance reports at GTI."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: type
              in: body
              type: string
              description: "Type."
          steps:
            - name: data
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
            - name: metrics
              type: call
              call: "analytics.compute"
              with:
                data: "{{data.results}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "compliance"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "compliance@co.com"
                subject: "{{type}} - {{quarter}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: metrics
          path: "/compute"
          operations:
            - name: compute
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks RabbitMQ at GTI.

naftiko: "0.5"
info:
  label: "RabbitMQ Queue Check"
  description: "Checks RabbitMQ at GTI."
  tags:
    - messaging
    - rabbitmq
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: rmq
      port: 8080
      tools:
        - name: check-queue
          description: "Check queue at GTI."
          inputParameters:
            - name: vhost
              in: body
              type: string
              description: "Vhost."
            - name: queue
              in: body
              type: string
              description: "Queue."
          call: "rmq.get-queue"
          with:
            vhost: "{{vhost}}"
            queue: "{{queue}}"
          outputParameters:
            - name: messages
              type: number
              mapping: "$.messages"
  consumes:
    - type: http
      namespace: rmq
      baseUri: "https://rmq.gtigrows.com:15672/api"
      authentication:
        type: bearer
        token: "$secrets.rmq_token"
      resources:
        - name: queues
          path: "/queues/{{vhost}}/{{queue}}"
          inputParameters:
            - name: vhost
              in: path
            - name: queue
              in: path
          operations:
            - name: get-queue
              method: GET

Checks RDS at GTI.

naftiko: "0.5"
info:
  label: "RDS Instance Check"
  description: "Checks RDS at GTI."
  tags:
    - database
    - aws
    - rds
capability:
  exposes:
    - type: mcp
      namespace: rds
      port: 8080
      tools:
        - name: check-db
          description: "Check RDS at GTI."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "rds.describe"
          with:
            id: "{{instance}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.DBInstances[0].DBInstanceStatus"
  consumes:
    - type: http
      namespace: rds
      baseUri: "https://rds.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: instances
          path: "/"
          operations:
            - name: describe
              method: GET

Checks Redis at GTI.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at GTI."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at GTI."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

Checks release readiness at GTI.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at GTI."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at GTI."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/gtigrows.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.gtigrows.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://gtigrows.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves a customer profile from Salesforce by email, returning name, loyalty tier, purchase history summary, and preferred dispensary location.

naftiko: "0.5"
info:
  label: "Salesforce Customer Lookup"
  description: "Retrieves a customer profile from Salesforce by email, returning name, loyalty tier, purchase history summary, and preferred dispensary location."
  tags:
    - dispensary
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-customer
          description: "Look up a customer in Salesforce by email. Returns name, loyalty tier, and preferred location."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The customer email address."
          call: "salesforce.get-contact"
          with:
            email: "{{email}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gti.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/query?q=SELECT+Id,Name,Loyalty_Tier__c,Preferred_Location__c+FROM+Contact+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: get-contact
              method: GET

Checks SAP PO at GTI.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at GTI."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at GTI."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.order.vendor"
            - name: status
              type: string
              mapping: "$.order.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Manages security training at GTI.

naftiko: "0.5"
info:
  label: "Security Training Pipeline"
  description: "Manages security training at GTI."
  tags:
    - security
    - training
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-training
      port: 8080
      tools:
        - name: manage-training
          description: "Manage training at GTI."
          inputParameters:
            - name: campaign
              in: body
              type: string
              description: "Campaign ID."
          steps:
            - name: untrained
              type: call
              call: "lms.get-incomplete"
              with:
                campaign: "{{campaign}}"
            - name: remind
              type: call
              call: "email.batch"
              with:
                to: "{{untrained.emails}}"
                subject: "Training due"
            - name: track
              type: call
              call: "lms.get-completion"
              with:
                campaign: "{{campaign}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "training"
  consumes:
    - type: http
      namespace: lms
      baseUri: "https://lms.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.lms_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign}}/incomplete"
          inputParameters:
            - name: campaign
              in: path
          operations:
            - name: get-incomplete
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Remediates vulnerabilities at GTI via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at GTI via scanning, Jira, and Slack."
  tags:
    - security
    - vulnerability-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-fix
      port: 8080
      tools:
        - name: remediate
          description: "Fix vulnerabilities at GTI."
          inputParameters:
            - name: target
              in: body
              type: string
              description: "Target."
            - name: policy
              in: body
              type: string
              description: "Policy."
          steps:
            - name: scan
              type: call
              call: "qualys.scan"
              with:
                target: "{{target}}"
                policy: "{{policy}}"
            - name: prioritize
              type: call
              call: "security.prioritize"
              with:
                scan: "{{scan.id}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Vulns: {{prioritize.critical}} critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Scan: {{prioritize.critical}} critical"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: scans
          path: "/fo/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: security
      baseUri: "https://security.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: vulns
          path: "/prioritize"
          operations:
            - name: prioritize
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gtigrows.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Tracks a cannabis batch from cultivation through sale by querying batch data from Oracle Cloud, verifying state compliance records, logging the audit trail in SharePoint, and notifying the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Seed-to-Sale Compliance Tracking Orchestrator"
  description: "Tracks a cannabis batch from cultivation through sale by querying batch data from Oracle Cloud, verifying state compliance records, logging the audit trail in SharePoint, and notifying the compliance team via Microsoft Teams."
  tags:
    - compliance
    - cultivation
    - seed-to-sale
    - oracle-cloud
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: seed-to-sale
      port: 8080
      tools:
        - name: track-batch-compliance
          description: "Given a batch ID and state, retrieve batch data, verify compliance, log audit trail, and notify the team."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch identifier."
            - name: state_code
              in: body
              type: string
              description: "The state jurisdiction code."
          steps:
            - name: get-batch
              type: call
              call: "oracle-cloud.get-batch"
              with:
                batch_id: "{{batch_id}}"
            - name: log-audit
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "compliance-audit"
                folder_path: "SeedToSale/{{state_code}}/{{batch_id}}"
                content: "Batch: {{batch_id}}. State: {{state_code}}. Strain: {{get-batch.strain}}. Weight: {{get-batch.weight}}g. Status: {{get-batch.compliance_status}}. Harvest date: {{get-batch.harvest_date}}."
            - name: notify-compliance
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "compliance"
                channel_id: "seed-to-sale"
                text: "Batch {{batch_id}} ({{state_code}}): {{get-batch.strain}}, {{get-batch.weight}}g. Compliance: {{get-batch.compliance_status}}. Audit: {{log-audit.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: batches
          path: "/lotBatches/{{batch_id}}"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-batch
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks IT incident in ServiceNow for GTI.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for GTI."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at GTI."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Looks up a ServiceNow IT incident by number, returning state, priority, assigned group, and resolution status.

naftiko: "0.5"
info:
  label: "ServiceNow IT Incident Lookup"
  description: "Looks up a ServiceNow IT incident by number, returning state, priority, assigned group, and resolution status."
  tags:
    - it-operations
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident
          description: "Retrieve a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Searches SharePoint for compliance documents, cultivation SOPs, and regulatory filings by keyword.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Searches SharePoint for compliance documents, cultivation SOPs, and regulatory filings by keyword."
  tags:
    - documentation
    - compliance
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-documents
          description: "Search SharePoint by keyword. Returns file names, URLs, and metadata."
          inputParameters:
            - name: keyword
              in: body
              type: string
              description: "Search keyword."
          call: "sharepoint.search"
          with:
            query: "{{keyword}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/gti-hub/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search
              method: GET

Retrieves SharePoint metadata at GTI.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at GTI."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at GTI."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at GTI via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at GTI via Datadog and Slack."
  tags:
    - operations
    - sla
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sla-monitor
      port: 8080
      tools:
        - name: check-sla
          description: "Monitor SLAs at GTI."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: target
              in: body
              type: number
              description: "SLA target %."
          steps:
            - name: metrics
              type: call
              call: "datadog.get-sla"
              with:
                service: "{{service}}"
            - name: check
              type: call
              call: "analytics.check-sla"
              with:
                uptime: "{{metrics.uptime}}"
                target: "{{target}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#ops"
                text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
            - name: log
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "SLA breach: {{service}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/metrics"
          operations:
            - name: get-sla
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gtigrows.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks Snowflake warehouse usage at GTI.

naftiko: "0.5"
info:
  label: "Snowflake Warehouse Usage"
  description: "Checks Snowflake warehouse usage at GTI."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sf-usage
      port: 8080
      tools:
        - name: check-warehouse
          description: "Check warehouse at GTI."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "Warehouse."
          call: "snowflake.get-usage"
          with:
            warehouse: "{{warehouse}}"
          outputParameters:
            - name: credits
              type: number
              mapping: "$.data.credits_used"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://gtigrows.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: warehouses
          path: "/statements"
          operations:
            - name: get-usage
              method: GET

Checks code quality at GTI.

naftiko: "0.5"
info:
  label: "SonarQube Quality Check"
  description: "Checks code quality at GTI."
  tags:
    - code-quality
    - sonarqube
    - devops
capability:
  exposes:
    - type: mcp
      namespace: sq
      port: 8080
      tools:
        - name: check-quality
          description: "Check quality at GTI."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project key."
          call: "sonarqube.get-measures"
          with:
            project: "{{project}}"
          outputParameters:
            - name: bugs
              type: number
              mapping: "$.component.measures[0].value"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.gtigrows.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: measures
          path: "/measures/component"
          operations:
            - name: get-measures
              method: GET

Searches Splunk at GTI.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at GTI."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at GTI."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL query."
          call: "splunk.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.results.count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.gtigrows.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Tracks upcoming state license renewals by querying Oracle Cloud, creates a renewal task in ServiceNow, documents requirements in Confluence, uploads supporting documents to SharePoint, and notifies the regulatory affairs team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "State License Renewal Pipeline"
  description: "Tracks upcoming state license renewals by querying Oracle Cloud, creates a renewal task in ServiceNow, documents requirements in Confluence, uploads supporting documents to SharePoint, and notifies the regulatory affairs team via Microsoft Teams."
  tags:
    - compliance
    - licensing
    - oracle-cloud
    - servicenow
    - confluence
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: license-renewal
      port: 8080
      tools:
        - name: process-license-renewal
          description: "Given a license number and state, retrieve details, create renewal task, document requirements, and notify the team."
          inputParameters:
            - name: license_number
              in: body
              type: string
              description: "The state cannabis license number."
            - name: state_code
              in: body
              type: string
              description: "The state jurisdiction code."
            - name: renewal_deadline
              in: body
              type: string
              description: "Renewal deadline in YYYY-MM-DD format."
          steps:
            - name: get-license
              type: call
              call: "oracle-cloud.get-license"
              with:
                license_number: "{{license_number}}"
            - name: create-renewal-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "License renewal: {{license_number}} — {{state_code}}"
                assigned_group: "Regulatory_Affairs"
                description: "License: {{license_number}}. State: {{state_code}}. Type: {{get-license.license_type}}. Expires: {{renewal_deadline}}. Facilities: {{get-license.facility_count}}."
            - name: document-requirements
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REGAFF"
                title: "License Renewal: {{license_number}} — {{state_code}}"
                body: "License: {{license_number}}. State: {{state_code}}. Deadline: {{renewal_deadline}}. Task: {{create-renewal-task.number}}."
            - name: provision-docs
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "regulatory-filings"
                folder_path: "Renewals/{{state_code}}/{{license_number}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "regulatory-affairs"
                channel_id: "license-renewals"
                text: "License renewal initiated: {{license_number}} ({{state_code}}). Deadline: {{renewal_deadline}}. Task: {{create-renewal-task.number}}. Docs: {{provision-docs.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: licenses
          path: "/licenses/{{license_number}}"
          inputParameters:
            - name: license_number
              in: path
          operations:
            - name: get-license
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://gti.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: 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 Teams activity at GTI.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at GTI."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at GTI."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Checks Terraform workspace at GTI.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at GTI."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at GTI."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-ws"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.attributes.name"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-ws
              method: GET

Checks Vault secret at GTI.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at GTI."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at GTI."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.gtigrows.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

Processes invoices at GTI via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at GTI via OCR, SAP matching, approval, and Oracle recording."
  tags:
    - finance
    - accounts-payable
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: invoice-proc
      port: 8080
      tools:
        - name: process-invoice
          description: "Process invoices at GTI."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
          steps:
            - name: extract
              type: call
              call: "ocr.extract"
              with:
                doc: "{{invoice_id}}"
            - name: match
              type: call
              call: "sap.match-po"
              with:
                vendor: "{{vendor_id}}"
                amount: "{{extract.total}}"
            - name: approve
              type: call
              call: "workflow.submit"
              with:
                invoice: "{{invoice_id}}"
            - name: record
              type: call
              call: "oracle.create-payment"
              with:
                invoice: "{{invoice_id}}"
  consumes:
    - type: http
      namespace: ocr
      baseUri: "https://ocr.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ocr_token"
      resources:
        - name: invoices
          path: "/extract"
          operations:
            - name: extract
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: pos
          path: "/match"
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: approvals
          path: "/submit"
          operations:
            - name: submit
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

When a new vendor is approved, creates the supplier in Oracle Cloud, opens a ServiceNow compliance checklist, uploads the contract to SharePoint, and notifies procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Onboarding Orchestrator"
  description: "When a new vendor is approved, creates the supplier in Oracle Cloud, opens a ServiceNow compliance checklist, uploads the contract to SharePoint, and notifies procurement via Microsoft Teams."
  tags:
    - procurement
    - vendor-management
    - oracle-cloud
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-onboarding
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create the supplier record, compliance task, store contract, and notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "The vendor company name."
            - name: vendor_email
              in: body
              type: string
              description: "The vendor primary contact email."
            - name: vendor_type
              in: body
              type: string
              description: "Vendor type (e.g. packaging, nutrients, equipment)."
          steps:
            - name: create-supplier
              type: call
              call: "oracle-cloud.create-supplier"
              with:
                name: "{{vendor_name}}"
                contact_email: "{{vendor_email}}"
                type: "{{vendor_type}}"
            - name: create-compliance-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Vendor compliance: {{vendor_name}}"
                assigned_group: "Procurement_Compliance"
                description: "Complete cannabis industry compliance review for {{vendor_name}} ({{vendor_type}}). Supplier ID: {{create-supplier.supplier_id}}."
            - name: upload-contract
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "procurement-docs"
                folder_path: "Contracts/{{vendor_name}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "procurement"
                channel_id: "vendor-management"
                text: "New vendor onboarded: {{vendor_name}} ({{vendor_type}}). ID: {{create-supplier.supplier_id}}. Compliance task: {{create-compliance-task.number}}. Contract: {{upload-contract.url}}."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://gti.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reviews vendors at GTI.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at GTI."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at GTI."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

Aggregates weekly sales from Oracle Cloud, correlates with web traffic from Google Analytics, refreshes the Power BI dashboard, and posts the summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Weekly Dispensary Sales Report Pipeline"
  description: "Aggregates weekly sales from Oracle Cloud, correlates with web traffic from Google Analytics, refreshes the Power BI dashboard, and posts the summary to Microsoft Teams."
  tags:
    - dispensary
    - sales
    - reporting
    - oracle-cloud
    - google-analytics
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: generate-weekly-sales
          description: "Given a week ending date, aggregate dispensary sales, web data, refresh dashboard, and notify leadership."
          inputParameters:
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD format."
          steps:
            - name: get-sales
              type: call
              call: "oracle-cloud.get-sales-summary"
              with:
                week_ending: "{{week_ending}}"
            - name: get-web-data
              type: call
              call: "google-analytics.run-report"
              with:
                end_date: "{{week_ending}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "dispensary-sales"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "leadership"
                channel_id: "weekly-reports"
                text: "Weekly Sales (w/e {{week_ending}}): Revenue: ${{get-sales.total_revenue}}. Transactions: {{get-sales.transaction_count}}. Online traffic: {{get-web-data.sessions}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: oracle-cloud
      baseUri: "https://gti.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: sales-summary
          path: "/salesSummary"
          operations:
            - name: get-sales-summary
              method: GET
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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 employee profile from Workday for GTI.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for GTI."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up GTI employee in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.worker.name"
            - name: title
              type: string
              mapping: "$.worker.title"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5.gtigrows.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

Retrieves an employee profile from Workday by worker ID, returning name, department, job title, location, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Record"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, location, and manager."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an employee in Workday. Returns name, department, title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Checks Zendesk ticket at GTI.

naftiko: "0.5"
info:
  label: "Zendesk Ticket Check"
  description: "Checks Zendesk ticket at GTI."
  tags:
    - support
    - zendesk
    - ticketing
capability:
  exposes:
    - type: mcp
      namespace: zd-ticket
      port: 8080
      tools:
        - name: check-ticket
          description: "Check ticket at GTI."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Ticket ID."
          call: "zendesk.get-ticket"
          with:
            id: "{{ticket_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ticket.status"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://gtigrows.com.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{id}}.json"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-ticket
              method: GET