Curaleaf Holdings Capabilities

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

Sort
Expand

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

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at Curaleaf 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 Curaleaf."
          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://curaleaf.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.curaleaf.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://curaleaf.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Verifies customer age at point of sale using an ID scanning service, returning verification status and whether the customer meets the state minimum age requirement.

naftiko: "0.5"
info:
  label: "Age Verification Check"
  description: "Verifies customer age at point of sale using an ID scanning service, returning verification status and whether the customer meets the state minimum age requirement."
  tags:
    - compliance
    - age-verification
    - dispensary
capability:
  exposes:
    - type: mcp
      namespace: age-verification
      port: 8080
      tools:
        - name: verify-age
          description: "Verify a customer's age using scanned ID data."
          inputParameters:
            - name: id_scan_data
              in: body
              type: string
              description: "Base64-encoded scanned ID barcode data."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code for minimum age requirement."
          call: "idscanner.verify"
          with:
            scan_data: "{{id_scan_data}}"
            state: "{{state_code}}"
  consumes:
    - type: http
      namespace: idscanner
      baseUri: "https://api.idscanner.com/v1"
      authentication:
        type: bearer
        token: "$secrets.idscanner_token"
      resources:
        - name: verification
          path: "/verify"
          operations:
            - name: verify
              method: POST

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

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.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://curaleaf.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 S3 bucket at Curaleaf.

naftiko: "0.5"
info:
  label: "S3 Bucket Stats"
  description: "Checks S3 bucket at Curaleaf."
  tags:
    - storage
    - aws
    - s3
capability:
  exposes:
    - type: mcp
      namespace: s3-stats
      port: 8080
      tools:
        - name: get-bucket
          description: "Get bucket stats at Curaleaf."
          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 Curaleaf.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at Curaleaf."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at Curaleaf."
          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/curaleaf.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

Verifies backups at Curaleaf.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at Curaleaf."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at Curaleaf."
          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.curaleaf.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://curaleaf.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 Curaleaf via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.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 Curaleaf by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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://curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at Curaleaf."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at Curaleaf."
          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.curaleaf.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://curaleaf.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 Curaleaf through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at Curaleaf 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 Curaleaf."
          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://curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

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

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at Curaleaf 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 Curaleaf."
          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.curaleaf.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://curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "CloudWatch Alarm Check"
  description: "Checks CloudWatch alarm at Curaleaf."
  tags:
    - monitoring
    - aws
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: cw-alarm
      port: 8080
      tools:
        - name: check-alarm
          description: "Check alarm at Curaleaf."
          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

Runs a daily compliance audit by pulling inventory from Dutchie, comparing against METRC manifests, and logging discrepancies as ServiceNow incidents.

naftiko: "0.5"
info:
  label: "Compliance Audit Orchestrator"
  description: "Runs a daily compliance audit by pulling inventory from Dutchie, comparing against METRC manifests, and logging discrepancies as ServiceNow incidents."
  tags:
    - compliance
    - audit
    - dutchie
    - metrc
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-audit
      port: 8080
      tools:
        - name: run-daily-audit
          description: "Execute a daily inventory-to-METRC reconciliation audit for a dispensary location."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code for METRC."
            - name: audit_date
              in: body
              type: string
              description: "The audit date in YYYY-MM-DD format."
          steps:
            - name: get-pos-inventory
              type: call
              call: "dutchie.list-inventory"
              with:
                location_id: "{{location_id}}"
            - name: get-metrc-inventory
              type: call
              call: "metrc.get-active-packages"
              with:
                state: "{{state_code}}"
                license: "{{location_id}}"
            - name: log-discrepancy
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Inventory discrepancy audit - {{location_id}} - {{audit_date}}"
                category: "compliance"
                description: "POS count: {{get-pos-inventory.total_items}}, METRC count: {{get-metrc-inventory.total_packages}}. Review required."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: inventory
          path: "/locations/{{location_id}}/inventory"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: list-inventory
              method: GET
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/packages/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: active-packages
          path: "/active"
          operations:
            - name: get-active-packages
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.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

Archives compliance documents such as COAs, manifests, and license copies to a secure SharePoint folder for regulatory reference.

naftiko: "0.5"
info:
  label: "Compliance Document Archive"
  description: "Archives compliance documents such as COAs, manifests, and license copies to a secure SharePoint folder for regulatory reference."
  tags:
    - compliance
    - documents
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: compliance-archive
      port: 8080
      tools:
        - name: archive-document
          description: "Archive a compliance document to SharePoint."
          inputParameters:
            - name: document_type
              in: body
              type: string
              description: "Type of document (coa, manifest, license)."
            - name: document_name
              in: body
              type: string
              description: "The document file name."
            - name: document_content
              in: body
              type: string
              description: "Base64-encoded document content."
          call: "sharepoint.upload-file"
          with:
            folder_path: "Compliance/{{document_type}}"
            file_name: "{{document_name}}"
            content: "{{document_content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/curaleaf-compliance/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Searches Confluence at Curaleaf.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at Curaleaf."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at Curaleaf."
          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://curaleaf.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

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

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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://curaleaf.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://curaleaf.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

Reallocates costs at Curaleaf.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at Curaleaf."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at Curaleaf."
          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.curaleaf.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.curaleaf.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

Retrieves the current growth stage, environmental readings, and nutrient schedule for a cultivation batch from the Grow Flow system.

naftiko: "0.5"
info:
  label: "Cultivation Batch Status"
  description: "Retrieves the current growth stage, environmental readings, and nutrient schedule for a cultivation batch from the Grow Flow system."
  tags:
    - cultivation
    - grow-flow
    - batch-tracking
capability:
  exposes:
    - type: mcp
      namespace: cultivation-ops
      port: 8080
      tools:
        - name: get-batch-status
          description: "Look up the status of a cultivation batch including growth phase, days in stage, and environment data."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch identifier."
          call: "growflow.get-batch"
          with:
            batch_id: "{{batch_id}}"
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: batches
          path: "/batches/{{batch_id}}"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-batch
              method: GET

When Argus Controls detects an out-of-range environmental reading, creates an urgent ServiceNow incident and sends a Slack alert to the grow team.

naftiko: "0.5"
info:
  label: "Cultivation Room Climate Alert"
  description: "When Argus Controls detects an out-of-range environmental reading, creates an urgent ServiceNow incident and sends a Slack alert to the grow team."
  tags:
    - cultivation
    - alerts
    - argus-controls
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: climate-alerts
      port: 8080
      tools:
        - name: trigger-climate-alert
          description: "Create an alert when cultivation room climate goes out of range."
          inputParameters:
            - name: room_id
              in: body
              type: string
              description: "The cultivation room identifier."
            - name: metric
              in: body
              type: string
              description: "The out-of-range metric (temperature, humidity, co2)."
            - name: current_value
              in: body
              type: string
              description: "The current reading value."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Climate alert: Room {{room_id}} - {{metric}} at {{current_value}}"
                category: "cultivation"
                urgency: "1"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#grow-alerts"
                text: "URGENT: Room {{room_id}} - {{metric}} reading at {{current_value}}. ServiceNow incident: {{create-incident.number}}. Immediate attention required."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates and assigns cultivation tasks in Grow Flow and sends task notifications to growers via Slack with details on the required action.

naftiko: "0.5"
info:
  label: "Cultivation Task Assignment"
  description: "Creates and assigns cultivation tasks in Grow Flow and sends task notifications to growers via Slack with details on the required action."
  tags:
    - cultivation
    - tasks
    - growflow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cultivation-tasks
      port: 8080
      tools:
        - name: assign-grow-task
          description: "Create a cultivation task and notify the assigned grower."
          inputParameters:
            - name: room_id
              in: body
              type: string
              description: "The cultivation room identifier."
            - name: task_type
              in: body
              type: string
              description: "The task type (watering, pruning, transplanting, harvesting)."
            - name: assignee_email
              in: body
              type: string
              description: "The email of the assigned grower."
            - name: notes
              in: body
              type: string
              description: "Additional task instructions."
          steps:
            - name: create-task
              type: call
              call: "growflow.create-task"
              with:
                room_id: "{{room_id}}"
                type: "{{task_type}}"
                assignee: "{{assignee_email}}"
                notes: "{{notes}}"
            - name: notify-grower
              type: call
              call: "slack.post-message"
              with:
                channel: "#cultivation-tasks"
                text: "Task assigned to {{assignee_email}}: {{task_type}} in Room {{room_id}}. Notes: {{notes}}. Task ID: {{create-task.task_id}}."
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Dutchie online order is placed, verifies patient status in BioTrack, reserves inventory, and sends an SMS pickup notification via Twilio.

naftiko: "0.5"
info:
  label: "Customer Order Fulfillment Pipeline"
  description: "When a Dutchie online order is placed, verifies patient status in BioTrack, reserves inventory, and sends an SMS pickup notification via Twilio."
  tags:
    - dispensary
    - orders
    - dutchie
    - biotrack
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: order-fulfillment
      port: 8080
      tools:
        - name: process-online-order
          description: "Process an online dispensary order through verification, reservation, and customer notification."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Dutchie online order identifier."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-order
              type: call
              call: "dutchie.get-order"
              with:
                order_id: "{{order_id}}"
            - name: verify-patient
              type: call
              call: "biotrack.verify-patient"
              with:
                card_id: "{{get-order.patient_card_id}}"
                state: "{{state_code}}"
            - name: reserve-inventory
              type: call
              call: "dutchie.reserve-items"
              with:
                order_id: "{{order_id}}"
                location_id: "{{get-order.location_id}}"
            - name: send-notification
              type: call
              call: "twilio.send-sms"
              with:
                to: "{{get-order.customer_phone}}"
                body: "Your Curaleaf order #{{order_id}} is ready for pickup. Please bring your ID and medical card."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: orders
          path: "/orders/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
        - name: reservations
          path: "/orders/{{order_id}}/reserve"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: reserve-items
              method: POST
    - type: http
      namespace: biotrack
      baseUri: "https://api.biotrack.com/v1"
      authentication:
        type: bearer
        token: "$secrets.biotrack_token"
      resources:
        - name: patients
          path: "/patients/verify"
          operations:
            - name: verify-patient
              method: POST
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Messages.json"
          operations:
            - name: send-sms
              method: POST

Retrieves a customer's complete purchase history from Dutchie POS across all dispensary locations, including products, dates, and spend totals.

naftiko: "0.5"
info:
  label: "Customer Purchase History"
  description: "Retrieves a customer's complete purchase history from Dutchie POS across all dispensary locations, including products, dates, and spend totals."
  tags:
    - customer
    - dispensary
    - dutchie
capability:
  exposes:
    - type: mcp
      namespace: customer-history
      port: 8080
      tools:
        - name: get-purchase-history
          description: "Retrieve a customer's purchase history across all locations."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Dutchie customer identifier."
          call: "dutchie.get-customer-orders"
          with:
            customer_id: "{{customer_id}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: customer-orders
          path: "/customers/{{customer_id}}/orders"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: get-customer-orders
              method: GET

Synchronizes the day's sales transactions from Dutchie POS to METRC, adjusting package quantities and logging any sync errors to ServiceNow.

naftiko: "0.5"
info:
  label: "Daily METRC Sync"
  description: "Synchronizes the day's sales transactions from Dutchie POS to METRC, adjusting package quantities and logging any sync errors to ServiceNow."
  tags:
    - compliance
    - sync
    - dutchie
    - metrc
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: metrc-sync
      port: 8080
      tools:
        - name: sync-daily-sales
          description: "Sync daily dispensary sales to METRC state tracking system."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: date
              in: body
              type: string
              description: "The sales date in YYYY-MM-DD format."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-transactions
              type: call
              call: "dutchie.get-transactions"
              with:
                location_id: "{{location_id}}"
                date: "{{date}}"
            - name: report-sales
              type: call
              call: "metrc.report-sales"
              with:
                transactions: "{{get-transactions.items}}"
                state: "{{state_code}}"
            - name: log-errors
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "METRC sync errors - {{location_id}} - {{date}}"
                category: "compliance"
                description: "Sync results: {{report-sales.success_count}} succeeded, {{report-sales.error_count}} failed."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: transactions
          path: "/locations/{{location_id}}/transactions"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-transactions
              method: GET
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/sales/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: receipts
          path: "/receipts"
          operations:
            - name: report-sales
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.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

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

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at Curaleaf 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 Curaleaf."
          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://curaleaf.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://curaleaf.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://curaleaf.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 Datadog monitor at Curaleaf.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at Curaleaf."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at Curaleaf."
          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

Processes a delivery order from Dutchie, assigns it to an available driver, generates a METRC transport manifest, and sends route details to the driver via Twilio SMS.

naftiko: "0.5"
info:
  label: "Delivery Order Dispatch"
  description: "Processes a delivery order from Dutchie, assigns it to an available driver, generates a METRC transport manifest, and sends route details to the driver via Twilio SMS."
  tags:
    - delivery
    - dispensary
    - dutchie
    - metrc
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: delivery-dispatch
      port: 8080
      tools:
        - name: dispatch-delivery
          description: "Dispatch a cannabis delivery order with compliance tracking and driver notification."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Dutchie delivery order identifier."
            - name: driver_id
              in: body
              type: string
              description: "The assigned driver identifier."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-order
              type: call
              call: "dutchie.get-order"
              with:
                order_id: "{{order_id}}"
            - name: create-manifest
              type: call
              call: "metrc.create-transfer"
              with:
                packages: "{{get-order.line_items}}"
                destination: "{{get-order.delivery_address}}"
                state: "{{state_code}}"
            - name: notify-driver
              type: call
              call: "twilio.send-sms"
              with:
                to: "{{driver_id}}"
                body: "New delivery assigned: Order #{{order_id}}. Address: {{get-order.delivery_address}}. Manifest #{{create-manifest.manifest_id}}."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: orders
          path: "/orders/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/transfers/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: transfers
          path: "/create"
          operations:
            - name: create-transfer
              method: POST
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Messages.json"
          operations:
            - name: send-sms
              method: POST

Queries the Dutchie dispensary POS system for current product inventory by location, returning strain name, quantity on hand, THC/CBD percentages, and pricing tier.

naftiko: "0.5"
info:
  label: "Dispensary Inventory Lookup"
  description: "Queries the Dutchie dispensary POS system for current product inventory by location, returning strain name, quantity on hand, THC/CBD percentages, and pricing tier."
  tags:
    - inventory
    - dispensary
    - dutchie
capability:
  exposes:
    - type: mcp
      namespace: dispensary-inventory
      port: 8080
      tools:
        - name: get-product-inventory
          description: "Look up current dispensary inventory for a specific location and product category."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The Dutchie dispensary location identifier."
            - name: category
              in: body
              type: string
              description: "Product category such as flower, edible, concentrate, or topical."
          call: "dutchie.list-inventory"
          with:
            location_id: "{{location_id}}"
            category: "{{category}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: inventory
          path: "/locations/{{location_id}}/inventory"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: list-inventory
              method: GET

Synchronizes product availability and pricing from Dutchie POS to the dispensary's Weedmaps listing and IHeartJane storefront.

naftiko: "0.5"
info:
  label: "Dispensary Menu Sync"
  description: "Synchronizes product availability and pricing from Dutchie POS to the dispensary's Weedmaps listing and IHeartJane storefront."
  tags:
    - marketing
    - menu
    - dutchie
    - weedmaps
capability:
  exposes:
    - type: mcp
      namespace: menu-sync
      port: 8080
      tools:
        - name: sync-menu
          description: "Synchronize dispensary menu across online marketplace listings."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
          steps:
            - name: get-menu
              type: call
              call: "dutchie.get-menu"
              with:
                location_id: "{{location_id}}"
            - name: update-weedmaps
              type: call
              call: "weedmaps.update-menu"
              with:
                location_id: "{{location_id}}"
                products: "{{get-menu.products}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: menus
          path: "/locations/{{location_id}}/menu"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-menu
              method: GET
    - type: http
      namespace: weedmaps
      baseUri: "https://api.weedmaps.com/v1"
      authentication:
        type: bearer
        token: "$secrets.weedmaps_token"
      resources:
        - name: menus
          path: "/listings/{{location_id}}/menu"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: update-menu
              method: PUT

Updates product pricing in Dutchie POS for a specific location based on new wholesale cost data from LeafLink.

naftiko: "0.5"
info:
  label: "Dispensary Price Update"
  description: "Updates product pricing in Dutchie POS for a specific location based on new wholesale cost data from LeafLink."
  tags:
    - pricing
    - dispensary
    - dutchie
    - leaflink
capability:
  exposes:
    - type: mcp
      namespace: pricing-management
      port: 8080
      tools:
        - name: update-product-price
          description: "Update a dispensary product price based on current wholesale cost."
          inputParameters:
            - name: product_id
              in: body
              type: string
              description: "The Dutchie product identifier."
            - name: order_number
              in: body
              type: string
              description: "The LeafLink order number for cost reference."
          steps:
            - name: get-wholesale-cost
              type: call
              call: "leaflink.get-order"
              with:
                order_number: "{{order_number}}"
            - name: update-price
              type: call
              call: "dutchie.update-product"
              with:
                product_id: "{{product_id}}"
                cost: "{{get-wholesale-cost.unit_cost}}"
  consumes:
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: orders
          path: "/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: products
          path: "/products/{{product_id}}"
          inputParameters:
            - name: product_id
              in: path
          operations:
            - name: update-product
              method: PUT

Pulls daily sales summary from Dutchie POS for a given dispensary location, returning total revenue, transaction count, average basket size, and top-selling products.

naftiko: "0.5"
info:
  label: "Dispensary Sales Report"
  description: "Pulls daily sales summary from Dutchie POS for a given dispensary location, returning total revenue, transaction count, average basket size, and top-selling products."
  tags:
    - sales
    - reporting
    - dutchie
capability:
  exposes:
    - type: mcp
      namespace: dispensary-sales
      port: 8080
      tools:
        - name: get-daily-sales
          description: "Retrieve daily sales summary for a dispensary location."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The Dutchie dispensary location identifier."
            - name: date
              in: body
              type: string
              description: "The report date in YYYY-MM-DD format."
          call: "dutchie.get-sales-report"
          with:
            location_id: "{{location_id}}"
            date: "{{date}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: sales-reports
          path: "/locations/{{location_id}}/sales"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-sales-report
              method: GET

Checks container at Curaleaf.

naftiko: "0.5"
info:
  label: "Docker Container Check"
  description: "Checks container at Curaleaf."
  tags:
    - containers
    - docker
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: docker
      port: 8080
      tools:
        - name: check-container
          description: "Check container at Curaleaf."
          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.curaleaf.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 Curaleaf via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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://curaleaf.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 Curaleaf via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at Curaleaf 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 Curaleaf."
          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://curaleaf.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Tracks the drying progress of harvested cannabis in Grow Flow, monitoring weight loss percentage and estimated completion timeline.

naftiko: "0.5"
info:
  label: "Drying Room Progress Tracker"
  description: "Tracks the drying progress of harvested cannabis in Grow Flow, monitoring weight loss percentage and estimated completion timeline."
  tags:
    - cultivation
    - drying
    - growflow
capability:
  exposes:
    - type: mcp
      namespace: drying-progress
      port: 8080
      tools:
        - name: get-drying-status
          description: "Check the drying progress for a harvested batch."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The harvest batch identifier."
          call: "growflow.get-drying-status"
          with:
            batch_id: "{{batch_id}}"
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: drying
          path: "/batches/{{batch_id}}/drying"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-drying-status
              method: GET

Checks ES index at Curaleaf.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at Curaleaf."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at Curaleaf."
          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.curaleaf.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 Curaleaf via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at Curaleaf 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 Curaleaf."
          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://curaleaf.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://curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

When a new employee is added in Paylocity, creates their compliance training assignments in a learning management system, provisions their Dutchie POS access, and notifies the store manager via Slack.

naftiko: "0.5"
info:
  label: "Employee Onboarding Pipeline"
  description: "When a new employee is added in Paylocity, creates their compliance training assignments in a learning management system, provisions their Dutchie POS access, and notifies the store manager via Slack."
  tags:
    - hr
    - onboarding
    - paylocity
    - dutchie
    - slack
capability:
  exposes:
    - type: mcp
      namespace: employee-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Orchestrate new dispensary employee onboarding across HR, POS, and communication systems."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Paylocity employee identifier."
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: role
              in: body
              type: string
              description: "The employee role (budtender, manager, pharmacist)."
          steps:
            - name: get-employee
              type: call
              call: "paylocity.get-employee"
              with:
                employee_id: "{{employee_id}}"
            - name: provision-pos
              type: call
              call: "dutchie.create-user"
              with:
                email: "{{get-employee.email}}"
                name: "{{get-employee.full_name}}"
                role: "{{role}}"
                location_id: "{{location_id}}"
            - name: notify-manager
              type: call
              call: "slack.post-message"
              with:
                channel: "#store-{{location_id}}"
                text: "New team member {{get-employee.full_name}} ({{role}}) has been onboarded. Dutchie POS access provisioned."
  consumes:
    - type: http
      namespace: paylocity
      baseUri: "https://api.paylocity.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.paylocity_token"
      resources:
        - name: employees
          path: "/employees/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-employee
              method: GET
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries the Paylocity HR system for the current week's dispensary employee schedule, returning shift assignments, hours, and role designations.

naftiko: "0.5"
info:
  label: "Employee Schedule Lookup"
  description: "Queries the Paylocity HR system for the current week's dispensary employee schedule, returning shift assignments, hours, and role designations."
  tags:
    - hr
    - scheduling
    - paylocity
capability:
  exposes:
    - type: mcp
      namespace: hr-scheduling
      port: 8080
      tools:
        - name: get-weekly-schedule
          description: "Retrieve the weekly employee schedule for a dispensary location."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: week_start
              in: body
              type: string
              description: "The Monday start date in YYYY-MM-DD format."
          call: "paylocity.get-schedule"
          with:
            location_id: "{{location_id}}"
            week_start: "{{week_start}}"
  consumes:
    - type: http
      namespace: paylocity
      baseUri: "https://api.paylocity.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.paylocity_token"
      resources:
        - name: schedules
          path: "/companies/{{location_id}}/schedules"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-schedule
              method: GET

Runs end-of-day reconciliation by comparing Dutchie POS totals with payment processor records from Square, generating a discrepancy report.

naftiko: "0.5"
info:
  label: "End-of-Day Reconciliation"
  description: "Runs end-of-day reconciliation by comparing Dutchie POS totals with payment processor records from Square, generating a discrepancy report."
  tags:
    - finance
    - reconciliation
    - dutchie
    - square
capability:
  exposes:
    - type: mcp
      namespace: eod-reconciliation
      port: 8080
      tools:
        - name: reconcile-daily-sales
          description: "Reconcile end-of-day POS totals against payment processor records."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: date
              in: body
              type: string
              description: "The business date in YYYY-MM-DD format."
          steps:
            - name: get-pos-totals
              type: call
              call: "dutchie.get-sales-report"
              with:
                location_id: "{{location_id}}"
                date: "{{date}}"
            - name: get-payment-totals
              type: call
              call: "square.get-daily-summary"
              with:
                location_id: "{{location_id}}"
                date: "{{date}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: sales-reports
          path: "/locations/{{location_id}}/sales"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-sales-report
              method: GET
    - type: http
      namespace: square
      baseUri: "https://connect.squareup.com/v2"
      authentication:
        type: bearer
        token: "$secrets.square_token"
      resources:
        - name: settlements
          path: "/locations/{{location_id}}/settlements"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-daily-summary
              method: GET

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

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

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

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at Curaleaf 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 Curaleaf."
          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.curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at Curaleaf."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at Curaleaf."
          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

Checks Google user at Curaleaf.

naftiko: "0.5"
info:
  label: "Google Workspace User Check"
  description: "Checks Google user at Curaleaf."
  tags:
    - identity
    - google-workspace
    - directory
capability:
  exposes:
    - type: mcp
      namespace: gws
      port: 8080
      tools:
        - name: check-user
          description: "Check user at Curaleaf."
          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 Curaleaf.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at Curaleaf."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at Curaleaf."
          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.curaleaf.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

Pulls the latest environmental sensor readings from Argus Controls for a specific cultivation room, returning temperature, humidity, CO2, and light intensity.

naftiko: "0.5"
info:
  label: "Harvest Environment Monitor"
  description: "Pulls the latest environmental sensor readings from Argus Controls for a specific cultivation room, returning temperature, humidity, CO2, and light intensity."
  tags:
    - cultivation
    - environment
    - argus-controls
capability:
  exposes:
    - type: mcp
      namespace: cultivation-environment
      port: 8080
      tools:
        - name: get-room-environment
          description: "Retrieve current environmental sensor readings for a cultivation room."
          inputParameters:
            - name: room_id
              in: body
              type: string
              description: "The cultivation room identifier."
          call: "argus.get-readings"
          with:
            room_id: "{{room_id}}"
  consumes:
    - type: http
      namespace: argus
      baseUri: "https://api.arguscontrols.com/v1"
      authentication:
        type: bearer
        token: "$secrets.argus_token"
      resources:
        - name: readings
          path: "/rooms/{{room_id}}/readings"
          inputParameters:
            - name: room_id
              in: path
          operations:
            - name: get-readings
              method: GET

Records harvest yield data in Grow Flow and reports the yield metrics to METRC for state compliance tracking.

naftiko: "0.5"
info:
  label: "Harvest Yield Tracking"
  description: "Records harvest yield data in Grow Flow and reports the yield metrics to METRC for state compliance tracking."
  tags:
    - cultivation
    - harvest
    - growflow
    - metrc
capability:
  exposes:
    - type: mcp
      namespace: harvest-yield
      port: 8080
      tools:
        - name: record-harvest-yield
          description: "Record a harvest yield and report to state compliance system."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch identifier."
            - name: wet_weight_grams
              in: body
              type: number
              description: "Total wet weight in grams."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: record-yield
              type: call
              call: "growflow.record-harvest"
              with:
                batch_id: "{{batch_id}}"
                wet_weight: "{{wet_weight_grams}}"
            - name: report-to-metrc
              type: call
              call: "metrc.create-harvest"
              with:
                batch_tag: "{{record-yield.metrc_tag}}"
                weight: "{{wet_weight_grams}}"
                state: "{{state_code}}"
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: harvests
          path: "/batches/{{batch_id}}/harvest"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: record-harvest
              method: POST
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/harvests/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: harvests
          path: "/create"
          operations:
            - name: create-harvest
              method: POST

Monitors Dutchie inventory levels and when a product falls below the reorder threshold, creates a purchase request in LeafLink and notifies the procurement team via Slack.

naftiko: "0.5"
info:
  label: "Inventory Reorder Alert"
  description: "Monitors Dutchie inventory levels and when a product falls below the reorder threshold, creates a purchase request in LeafLink and notifies the procurement team via Slack."
  tags:
    - inventory
    - procurement
    - dutchie
    - leaflink
    - slack
capability:
  exposes:
    - type: mcp
      namespace: inventory-reorder
      port: 8080
      tools:
        - name: check-and-reorder
          description: "Check inventory levels and create reorder requests for low-stock products."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: product_id
              in: body
              type: string
              description: "The Dutchie product identifier."
            - name: reorder_threshold
              in: body
              type: number
              description: "Minimum quantity before reorder is triggered."
          steps:
            - name: check-stock
              type: call
              call: "dutchie.get-product-stock"
              with:
                location_id: "{{location_id}}"
                product_id: "{{product_id}}"
            - name: create-order
              type: call
              call: "leaflink.create-order"
              with:
                product_id: "{{product_id}}"
                quantity: "{{reorder_threshold}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#procurement"
                text: "Reorder placed for product {{product_id}} at location {{location_id}}. Current stock: {{check-stock.quantity}}. LeafLink order: {{create-order.order_number}}."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: stock
          path: "/locations/{{location_id}}/products/{{product_id}}"
          inputParameters:
            - name: location_id
              in: path
            - name: product_id
              in: path
          operations:
            - name: get-product-stock
              method: GET
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at Curaleaf 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 Curaleaf."
          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://curaleaf.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

Retrieves sprint progress at Curaleaf.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at Curaleaf."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at Curaleaf."
          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://curaleaf.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

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

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at Curaleaf 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 Curaleaf."
          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://curaleaf.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.curaleaf.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

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

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at Curaleaf 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 Curaleaf."
          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://curaleaf.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.curaleaf.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.curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at Curaleaf."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at Curaleaf."
          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.curaleaf.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

Fetches lab test results from Confident Cannabis for a specific sample, returning potency, terpene profile, pesticide, and heavy metals test data.

naftiko: "0.5"
info:
  label: "Lab Test Results Retrieval"
  description: "Fetches lab test results from Confident Cannabis for a specific sample, returning potency, terpene profile, pesticide, and heavy metals test data."
  tags:
    - lab-testing
    - quality
    - confident-cannabis
capability:
  exposes:
    - type: mcp
      namespace: lab-testing
      port: 8080
      tools:
        - name: get-lab-results
          description: "Retrieve lab test results for a cannabis sample by sample ID."
          inputParameters:
            - name: sample_id
              in: body
              type: string
              description: "The lab sample identifier."
          call: "confidentcannabis.get-sample"
          with:
            sample_id: "{{sample_id}}"
  consumes:
    - type: http
      namespace: confidentcannabis
      baseUri: "https://api.confidentcannabis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.confidentcannabis_token"
      resources:
        - name: samples
          path: "/samples/{{sample_id}}"
          inputParameters:
            - name: sample_id
              in: path
          operations:
            - name: get-sample
              method: GET

Checks state cannabis license expiration dates and creates ServiceNow renewal tickets when a license is within 90 days of expiry.

naftiko: "0.5"
info:
  label: "License Expiration Monitor"
  description: "Checks state cannabis license expiration dates and creates ServiceNow renewal tickets when a license is within 90 days of expiry."
  tags:
    - compliance
    - licensing
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: license-monitor
      port: 8080
      tools:
        - name: check-license-expiry
          description: "Check a cannabis license expiration date and create a renewal ticket if needed."
          inputParameters:
            - name: license_number
              in: body
              type: string
              description: "The state cannabis license number."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-license
              type: call
              call: "metrc.get-license"
              with:
                license_number: "{{license_number}}"
                state: "{{state_code}}"
            - name: create-renewal-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "License renewal required: {{license_number}} expires {{get-license.expiry_date}}"
                category: "compliance"
                description: "State license {{license_number}} ({{state_code}}) expires on {{get-license.expiry_date}}. Initiate renewal process."
  consumes:
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/facilities/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: licenses
          path: "/{{license_number}}"
          inputParameters:
            - name: license_number
              in: path
          operations:
            - name: get-license
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.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

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

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.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://curaleaf.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

Creates a promotional campaign in Springbig loyalty platform and pushes marketing content to Dutchie's featured products section.

naftiko: "0.5"
info:
  label: "Loyalty Campaign Launcher"
  description: "Creates a promotional campaign in Springbig loyalty platform and pushes marketing content to Dutchie's featured products section."
  tags:
    - marketing
    - loyalty
    - springbig
    - dutchie
capability:
  exposes:
    - type: mcp
      namespace: loyalty-campaigns
      port: 8080
      tools:
        - name: launch-campaign
          description: "Launch a loyalty marketing campaign with POS integration."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "The name of the campaign."
            - name: points_multiplier
              in: body
              type: number
              description: "Points multiplier for the promotion period."
            - name: product_ids
              in: body
              type: string
              description: "Comma-separated Dutchie product IDs to feature."
            - name: start_date
              in: body
              type: string
              description: "Campaign start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Campaign end date in YYYY-MM-DD format."
          steps:
            - name: create-campaign
              type: call
              call: "springbig.create-campaign"
              with:
                name: "{{campaign_name}}"
                multiplier: "{{points_multiplier}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: feature-products
              type: call
              call: "dutchie.set-featured"
              with:
                product_ids: "{{product_ids}}"
                promo_id: "{{create-campaign.campaign_id}}"
  consumes:
    - type: http
      namespace: springbig
      baseUri: "https://api.springbig.com/v1"
      authentication:
        type: bearer
        token: "$secrets.springbig_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: featured
          path: "/products/featured"
          operations:
            - name: set-featured
              method: POST

Queries the Springbig loyalty platform for a customer's current points balance, tier status, and available rewards.

naftiko: "0.5"
info:
  label: "Loyalty Points Balance"
  description: "Queries the Springbig loyalty platform for a customer's current points balance, tier status, and available rewards."
  tags:
    - loyalty
    - customer
    - springbig
capability:
  exposes:
    - type: mcp
      namespace: loyalty-program
      port: 8080
      tools:
        - name: get-loyalty-balance
          description: "Retrieve a customer's loyalty points balance and available rewards."
          inputParameters:
            - name: customer_phone
              in: body
              type: string
              description: "The customer phone number associated with the loyalty account."
          call: "springbig.get-member"
          with:
            phone: "{{customer_phone}}"
  consumes:
    - type: http
      namespace: springbig
      baseUri: "https://api.springbig.com/v1"
      authentication:
        type: bearer
        token: "$secrets.springbig_token"
      resources:
        - name: members
          path: "/members/lookup"
          operations:
            - name: get-member
              method: GET

Validates a cannabis product METRC tag number against the state tracking system, returning package status, lab test results, and chain-of-custody history.

naftiko: "0.5"
info:
  label: "METRC Compliance Tag Validator"
  description: "Validates a cannabis product METRC tag number against the state tracking system, returning package status, lab test results, and chain-of-custody history."
  tags:
    - compliance
    - metrc
    - seed-to-sale
capability:
  exposes:
    - type: mcp
      namespace: compliance-metrc
      port: 8080
      tools:
        - name: validate-metrc-tag
          description: "Validate a METRC tag and retrieve associated package details."
          inputParameters:
            - name: tag_number
              in: body
              type: string
              description: "The METRC package tag number."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code for the METRC instance."
          call: "metrc.get-package"
          with:
            tag: "{{tag_number}}"
            state: "{{state_code}}"
  consumes:
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/packages/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: packages
          path: "/{{tag}}"
          inputParameters:
            - name: tag
              in: path
          operations:
            - name: get-package
              method: GET

Generates monthly security reports at Curaleaf from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Retrieves current cannabis excise tax rates for a given state jurisdiction, used during POS transaction processing for accurate tax calculation.

naftiko: "0.5"
info:
  label: "Multi-State Tax Rate Lookup"
  description: "Retrieves current cannabis excise tax rates for a given state jurisdiction, used during POS transaction processing for accurate tax calculation."
  tags:
    - finance
    - tax
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: tax-rates
      port: 8080
      tools:
        - name: get-tax-rate
          description: "Look up the current cannabis excise and sales tax rates for a jurisdiction."
          inputParameters:
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
            - name: county
              in: body
              type: string
              description: "County name for local tax rates."
          call: "taxjar.get-rates"
          with:
            state: "{{state_code}}"
            county: "{{county}}"
  consumes:
    - type: http
      namespace: taxjar
      baseUri: "https://api.taxjar.com/v2"
      authentication:
        type: bearer
        token: "$secrets.taxjar_token"
      resources:
        - name: rates
          path: "/rates"
          operations:
            - name: get-rates
              method: GET

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

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at Curaleaf 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 Curaleaf."
          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://curaleaf.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://curaleaf.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

Orchestrates a new dispensary location launch by creating the location in Dutchie, registering with METRC, setting up Springbig loyalty, and announcing on Slack.

naftiko: "0.5"
info:
  label: "New Location Launch Pipeline"
  description: "Orchestrates a new dispensary location launch by creating the location in Dutchie, registering with METRC, setting up Springbig loyalty, and announcing on Slack."
  tags:
    - operations
    - launch
    - dutchie
    - metrc
    - springbig
    - slack
capability:
  exposes:
    - type: mcp
      namespace: location-launch
      port: 8080
      tools:
        - name: launch-new-location
          description: "Orchestrate the system setup for a new dispensary location."
          inputParameters:
            - name: location_name
              in: body
              type: string
              description: "The new dispensary location name."
            - name: address
              in: body
              type: string
              description: "The physical address of the new location."
            - name: license_number
              in: body
              type: string
              description: "The state cannabis license number."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: create-dutchie-location
              type: call
              call: "dutchie.create-location"
              with:
                name: "{{location_name}}"
                address: "{{address}}"
                license: "{{license_number}}"
            - name: register-metrc
              type: call
              call: "metrc.register-facility"
              with:
                license_number: "{{license_number}}"
                name: "{{location_name}}"
                state: "{{state_code}}"
            - name: setup-loyalty
              type: call
              call: "springbig.create-location"
              with:
                name: "{{location_name}}"
                address: "{{address}}"
            - name: announce
              type: call
              call: "slack.post-message"
              with:
                channel: "#operations"
                text: "New location launched: {{location_name}} at {{address}}. Dutchie ID: {{create-dutchie-location.location_id}}. METRC registered. Loyalty program active."
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: locations
          path: "/locations"
          operations:
            - name: create-location
              method: POST
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/facilities/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: facilities
          path: "/register"
          operations:
            - name: register-facility
              method: POST
    - type: http
      namespace: springbig
      baseUri: "https://api.springbig.com/v1"
      authentication:
        type: bearer
        token: "$secrets.springbig_token"
      resources:
        - name: locations
          path: "/locations"
          operations:
            - name: create-location
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks New Relic APM at Curaleaf.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at Curaleaf."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at Curaleaf."
          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

When a new strain is created in Grow Flow, registers the strain in METRC, creates a product listing in Dutchie, and notifies the marketing team via Slack.

naftiko: "0.5"
info:
  label: "New Strain Registration Pipeline"
  description: "When a new strain is created in Grow Flow, registers the strain in METRC, creates a product listing in Dutchie, and notifies the marketing team via Slack."
  tags:
    - cultivation
    - product-management
    - growflow
    - metrc
    - dutchie
    - slack
capability:
  exposes:
    - type: mcp
      namespace: strain-registration
      port: 8080
      tools:
        - name: register-new-strain
          description: "Register a new cannabis strain across compliance, POS, and marketing systems."
          inputParameters:
            - name: strain_name
              in: body
              type: string
              description: "The name of the new strain."
            - name: strain_type
              in: body
              type: string
              description: "Indica, sativa, or hybrid classification."
            - name: thc_range
              in: body
              type: string
              description: "Expected THC percentage range."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: create-batch
              type: call
              call: "growflow.create-strain"
              with:
                name: "{{strain_name}}"
                type: "{{strain_type}}"
            - name: register-metrc
              type: call
              call: "metrc.create-strain"
              with:
                name: "{{strain_name}}"
                type: "{{strain_type}}"
                state: "{{state_code}}"
            - name: create-product
              type: call
              call: "dutchie.create-product"
              with:
                name: "{{strain_name}}"
                category: "flower"
                strain_type: "{{strain_type}}"
                thc_range: "{{thc_range}}"
            - name: notify-marketing
              type: call
              call: "slack.post-message"
              with:
                channel: "#new-products"
                text: "New strain registered: {{strain_name}} ({{strain_type}}). THC: {{thc_range}}. Dutchie product ID: {{create-product.product_id}}."
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: strains
          path: "/strains"
          operations:
            - name: create-strain
              method: POST
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/strains/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: strains
          path: "/create"
          operations:
            - name: create-strain
              method: POST
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: products
          path: "/products"
          operations:
            - name: create-product
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current nutrient feeding schedule for a cultivation batch from Grow Flow, including EC targets, pH ranges, and nutrient mix ratios.

naftiko: "0.5"
info:
  label: "Nutrient Feed Schedule Lookup"
  description: "Retrieves the current nutrient feeding schedule for a cultivation batch from Grow Flow, including EC targets, pH ranges, and nutrient mix ratios."
  tags:
    - cultivation
    - nutrients
    - growflow
capability:
  exposes:
    - type: mcp
      namespace: nutrient-schedule
      port: 8080
      tools:
        - name: get-feed-schedule
          description: "Retrieve the current nutrient feed schedule for a cultivation batch."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The cultivation batch identifier."
          call: "growflow.get-feed-schedule"
          with:
            batch_id: "{{batch_id}}"
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: feed-schedules
          path: "/batches/{{batch_id}}/feed-schedule"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: get-feed-schedule
              method: GET

Checks Okta user at Curaleaf.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at Curaleaf."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at Curaleaf."
          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://curaleaf.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

Generates compliant product labels by pulling package data from METRC and lab results from Confident Cannabis, outputting label-ready data.

naftiko: "0.5"
info:
  label: "Package Label Generator"
  description: "Generates compliant product labels by pulling package data from METRC and lab results from Confident Cannabis, outputting label-ready data."
  tags:
    - compliance
    - labeling
    - metrc
    - confident-cannabis
capability:
  exposes:
    - type: mcp
      namespace: label-generation
      port: 8080
      tools:
        - name: generate-label-data
          description: "Generate state-compliant product label data from METRC and lab results."
          inputParameters:
            - name: tag_number
              in: body
              type: string
              description: "The METRC package tag number."
            - name: sample_id
              in: body
              type: string
              description: "The Confident Cannabis lab sample ID."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-package
              type: call
              call: "metrc.get-package"
              with:
                tag: "{{tag_number}}"
                state: "{{state_code}}"
            - name: get-lab-results
              type: call
              call: "confidentcannabis.get-sample"
              with:
                sample_id: "{{sample_id}}"
  consumes:
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/packages/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: packages
          path: "/{{tag}}"
          inputParameters:
            - name: tag
              in: path
          operations:
            - name: get-package
              method: GET
    - type: http
      namespace: confidentcannabis
      baseUri: "https://api.confidentcannabis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.confidentcannabis_token"
      resources:
        - name: samples
          path: "/samples/{{sample_id}}"
          inputParameters:
            - name: sample_id
              in: path
          operations:
            - name: get-sample
              method: GET

Checks on-call at Curaleaf.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at Curaleaf."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at Curaleaf."
          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

Verifies a medical cannabis patient's card status and purchase limits via the BioTrack state compliance system.

naftiko: "0.5"
info:
  label: "Patient Verification"
  description: "Verifies a medical cannabis patient's card status and purchase limits via the BioTrack state compliance system."
  tags:
    - compliance
    - patient
    - biotrack
capability:
  exposes:
    - type: mcp
      namespace: patient-compliance
      port: 8080
      tools:
        - name: verify-patient
          description: "Verify a medical cannabis patient card and retrieve remaining purchase allotments."
          inputParameters:
            - name: patient_card_id
              in: body
              type: string
              description: "The patient medical card number."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          call: "biotrack.verify-patient"
          with:
            card_id: "{{patient_card_id}}"
            state: "{{state_code}}"
  consumes:
    - type: http
      namespace: biotrack
      baseUri: "https://api.biotrack.com/v1"
      authentication:
        type: bearer
        token: "$secrets.biotrack_token"
      resources:
        - name: patients
          path: "/patients/verify"
          operations:
            - name: verify-patient
              method: POST

Exports weekly timesheet hours from the Paylocity system for a specific dispensary location, formatted for payroll processing.

naftiko: "0.5"
info:
  label: "Payroll Hours Export"
  description: "Exports weekly timesheet hours from the Paylocity system for a specific dispensary location, formatted for payroll processing."
  tags:
    - hr
    - payroll
    - paylocity
capability:
  exposes:
    - type: mcp
      namespace: payroll-export
      port: 8080
      tools:
        - name: export-weekly-hours
          description: "Export weekly timesheet hours for payroll processing."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: week_ending
              in: body
              type: string
              description: "The week ending date in YYYY-MM-DD format."
          call: "paylocity.get-timesheets"
          with:
            location_id: "{{location_id}}"
            week_ending: "{{week_ending}}"
  consumes:
    - type: http
      namespace: paylocity
      baseUri: "https://api.paylocity.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.paylocity_token"
      resources:
        - name: timesheets
          path: "/companies/{{location_id}}/timesheets"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-timesheets
              method: GET

Creates postmortems at Curaleaf.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at Curaleaf."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at Curaleaf."
          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://curaleaf.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

Checks Power BI refresh at Curaleaf.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at Curaleaf."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at Curaleaf."
          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 lab test failure is detected in Confident Cannabis, flags affected packages in METRC, pulls them from Dutchie shelves, and creates a ServiceNow incident for recall tracking.

naftiko: "0.5"
info:
  label: "Product Recall Orchestrator"
  description: "When a lab test failure is detected in Confident Cannabis, flags affected packages in METRC, pulls them from Dutchie shelves, and creates a ServiceNow incident for recall tracking."
  tags:
    - compliance
    - recall
    - confident-cannabis
    - metrc
    - dutchie
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: product-recall
      port: 8080
      tools:
        - name: initiate-recall
          description: "Initiate a product recall based on a failed lab test result."
          inputParameters:
            - name: sample_id
              in: body
              type: string
              description: "The Confident Cannabis sample ID that failed testing."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-failed-test
              type: call
              call: "confidentcannabis.get-sample"
              with:
                sample_id: "{{sample_id}}"
            - name: flag-metrc-package
              type: call
              call: "metrc.update-package-status"
              with:
                tag: "{{get-failed-test.metrc_tag}}"
                status: "on_hold"
                state: "{{state_code}}"
            - name: deactivate-product
              type: call
              call: "dutchie.deactivate-product"
              with:
                product_id: "{{get-failed-test.product_id}}"
            - name: create-recall-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Product recall: {{get-failed-test.strain_name}} - failed {{get-failed-test.failure_reason}}"
                category: "compliance_recall"
                urgency: "1"
                description: "Sample {{sample_id}} failed lab testing. METRC tag {{get-failed-test.metrc_tag}} placed on hold. Dutchie product deactivated."
  consumes:
    - type: http
      namespace: confidentcannabis
      baseUri: "https://api.confidentcannabis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.confidentcannabis_token"
      resources:
        - name: samples
          path: "/samples/{{sample_id}}"
          inputParameters:
            - name: sample_id
              in: path
          operations:
            - name: get-sample
              method: GET
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/packages/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: packages
          path: "/{{tag}}"
          inputParameters:
            - name: tag
              in: path
          operations:
            - name: update-package-status
              method: PUT
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: products
          path: "/products/{{product_id}}/deactivate"
          inputParameters:
            - name: product_id
              in: path
          operations:
            - name: deactivate-product
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

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

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at Curaleaf 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 Curaleaf."
          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://curaleaf.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.curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Generates a quarterly compliance summary by pulling METRC transfer counts, waste disposal records from Grow Flow, and incident data from ServiceNow into a consolidated report.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Generator"
  description: "Generates a quarterly compliance summary by pulling METRC transfer counts, waste disposal records from Grow Flow, and incident data from ServiceNow into a consolidated report."
  tags:
    - compliance
    - reporting
    - metrc
    - growflow
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: generate-quarterly-report
          description: "Generate a quarterly compliance summary report from multiple data sources."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "The quarter in Q1-Q4 format."
            - name: year
              in: body
              type: string
              description: "The fiscal year."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: get-transfers
              type: call
              call: "metrc.get-transfer-summary"
              with:
                quarter: "{{quarter}}"
                year: "{{year}}"
                state: "{{state_code}}"
            - name: get-waste-records
              type: call
              call: "growflow.get-waste-summary"
              with:
                quarter: "{{quarter}}"
                year: "{{year}}"
            - name: get-incidents
              type: call
              call: "servicenow.get-compliance-incidents"
              with:
                quarter: "{{quarter}}"
                year: "{{year}}"
  consumes:
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/transfers/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: transfers
          path: "/summary"
          operations:
            - name: get-transfer-summary
              method: GET
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: waste-summary
          path: "/waste/summary"
          operations:
            - name: get-waste-summary
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-compliance-incidents
              method: GET

Checks Redis at Curaleaf.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at Curaleaf."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at Curaleaf."
          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.curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at Curaleaf."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at Curaleaf."
          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/curaleaf.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.curaleaf.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.curaleaf.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://curaleaf.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Checks SAP PO at Curaleaf.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at Curaleaf."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at Curaleaf."
          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.curaleaf.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

When a security event is flagged, logs the incident in ServiceNow with camera footage reference and notifies the security team via Slack.

naftiko: "0.5"
info:
  label: "Security Camera Incident Logger"
  description: "When a security event is flagged, logs the incident in ServiceNow with camera footage reference and notifies the security team via Slack."
  tags:
    - security
    - dispensary
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: security-incidents
      port: 8080
      tools:
        - name: log-security-incident
          description: "Log a dispensary security incident with camera reference and team notification."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: camera_id
              in: body
              type: string
              description: "The security camera identifier."
            - name: incident_type
              in: body
              type: string
              description: "Type of security event."
            - name: timestamp
              in: body
              type: string
              description: "Event timestamp in ISO 8601 format."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security event at {{location_id}}: {{incident_type}}"
                category: "security"
                description: "Camera {{camera_id}} flagged {{incident_type}} at {{timestamp}} for location {{location_id}}."
            - name: notify-security
              type: call
              call: "slack.post-message"
              with:
                channel: "#security-alerts"
                text: "Security alert: {{incident_type}} at location {{location_id}}, camera {{camera_id}}. Time: {{timestamp}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at Curaleaf 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 Curaleaf."
          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.curaleaf.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://curaleaf.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

Checks IT incident in ServiceNow for Curaleaf.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for Curaleaf."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at Curaleaf."
          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://curaleaf.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

Retrieves SharePoint metadata at Curaleaf.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at Curaleaf."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at Curaleaf."
          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 Curaleaf via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at Curaleaf 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 Curaleaf."
          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://curaleaf.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

Creates a targeted SMS marketing campaign in Springbig based on customer purchase history, sends messages via Twilio, and tracks opt-outs.

naftiko: "0.5"
info:
  label: "SMS Marketing Campaign"
  description: "Creates a targeted SMS marketing campaign in Springbig based on customer purchase history, sends messages via Twilio, and tracks opt-outs."
  tags:
    - marketing
    - sms
    - springbig
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: sms-campaigns
      port: 8080
      tools:
        - name: launch-sms-campaign
          description: "Launch a targeted SMS marketing campaign to dispensary customers."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "Name of the SMS campaign."
            - name: segment
              in: body
              type: string
              description: "Customer segment to target."
            - name: message_text
              in: body
              type: string
              description: "The SMS message body."
          steps:
            - name: get-audience
              type: call
              call: "springbig.get-segment"
              with:
                segment: "{{segment}}"
            - name: send-campaign
              type: call
              call: "springbig.send-campaign"
              with:
                name: "{{campaign_name}}"
                audience_id: "{{get-audience.segment_id}}"
                message: "{{message_text}}"
  consumes:
    - type: http
      namespace: springbig
      baseUri: "https://api.springbig.com/v1"
      authentication:
        type: bearer
        token: "$secrets.springbig_token"
      resources:
        - name: segments
          path: "/segments/{{segment}}"
          inputParameters:
            - name: segment
              in: path
          operations:
            - name: get-segment
              method: GET
        - name: campaigns
          path: "/campaigns/send"
          operations:
            - name: send-campaign
              method: POST

Checks Snowflake warehouse usage at Curaleaf.

naftiko: "0.5"
info:
  label: "Snowflake Warehouse Usage"
  description: "Checks Snowflake warehouse usage at Curaleaf."
  tags:
    - data
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sf-usage
      port: 8080
      tools:
        - name: check-warehouse
          description: "Check warehouse at Curaleaf."
          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://curaleaf.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 Curaleaf.

naftiko: "0.5"
info:
  label: "SonarQube Quality Check"
  description: "Checks code quality at Curaleaf."
  tags:
    - code-quality
    - sonarqube
    - devops
capability:
  exposes:
    - type: mcp
      namespace: sq
      port: 8080
      tools:
        - name: check-quality
          description: "Check quality at Curaleaf."
          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.curaleaf.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: measures
          path: "/measures/component"
          operations:
            - name: get-measures
              method: GET

Searches Splunk at Curaleaf.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at Curaleaf."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at Curaleaf."
          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.curaleaf.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Aggregates sales from Dutchie, inventory counts from Grow Flow, and employee hours from Paylocity to produce a store performance data snapshot.

naftiko: "0.5"
info:
  label: "Store Performance Dashboard Data"
  description: "Aggregates sales from Dutchie, inventory counts from Grow Flow, and employee hours from Paylocity to produce a store performance data snapshot."
  tags:
    - reporting
    - analytics
    - dutchie
    - growflow
    - paylocity
capability:
  exposes:
    - type: mcp
      namespace: store-performance
      port: 8080
      tools:
        - name: get-store-performance
          description: "Gather multi-source performance data for a dispensary location."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The dispensary location identifier."
            - name: date
              in: body
              type: string
              description: "The report date in YYYY-MM-DD format."
          steps:
            - name: get-sales
              type: call
              call: "dutchie.get-sales-report"
              with:
                location_id: "{{location_id}}"
                date: "{{date}}"
            - name: get-inventory
              type: call
              call: "growflow.get-inventory-summary"
              with:
                location_id: "{{location_id}}"
            - name: get-labor
              type: call
              call: "paylocity.get-hours"
              with:
                location_id: "{{location_id}}"
                date: "{{date}}"
  consumes:
    - type: http
      namespace: dutchie
      baseUri: "https://api.dutchie.com/v1"
      authentication:
        type: bearer
        token: "$secrets.dutchie_token"
      resources:
        - name: sales-reports
          path: "/locations/{{location_id}}/sales"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-sales-report
              method: GET
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: inventory-summary
          path: "/locations/{{location_id}}/inventory/summary"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-inventory-summary
              method: GET
    - type: http
      namespace: paylocity
      baseUri: "https://api.paylocity.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.paylocity_token"
      resources:
        - name: hours
          path: "/companies/{{location_id}}/hours"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-hours
              method: GET

Retrieves Teams activity at Curaleaf.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at Curaleaf."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at Curaleaf."
          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 Curaleaf.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at Curaleaf."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at Curaleaf."
          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

Retrieves order details from LeafLink, creates a METRC transfer manifest, and generates a transport manifest document in DocuSign for driver signature.

naftiko: "0.5"
info:
  label: "Transport Manifest Generator"
  description: "Retrieves order details from LeafLink, creates a METRC transfer manifest, and generates a transport manifest document in DocuSign for driver signature."
  tags:
    - logistics
    - compliance
    - leaflink
    - metrc
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: transport-manifest
      port: 8080
      tools:
        - name: generate-manifest
          description: "Given a wholesale order number, generate a compliant transport manifest with METRC tracking and DocuSign signature envelope."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The LeafLink wholesale order number."
            - name: driver_email
              in: body
              type: string
              description: "The email address of the transport driver."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code for METRC."
          steps:
            - name: get-order
              type: call
              call: "leaflink.get-order"
              with:
                order_number: "{{order_number}}"
            - name: create-transfer
              type: call
              call: "metrc.create-transfer"
              with:
                packages: "{{get-order.line_items}}"
                destination: "{{get-order.ship_to}}"
                state: "{{state_code}}"
            - name: send-for-signature
              type: call
              call: "docusign.create-envelope"
              with:
                template_id: "transport_manifest_template"
                signer_email: "{{driver_email}}"
                manifest_id: "{{create-transfer.manifest_id}}"
  consumes:
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: orders
          path: "/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/transfers/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: transfers
          path: "/create"
          operations:
            - name: create-transfer
              method: POST
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes"
          operations:
            - name: create-envelope
              method: POST

Checks Vault secret at Curaleaf.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at Curaleaf."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at Curaleaf."
          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.curaleaf.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

Imports a vendor's current product catalog from LeafLink into the dispensary procurement system for ordering reference.

naftiko: "0.5"
info:
  label: "Vendor Catalog Import"
  description: "Imports a vendor's current product catalog from LeafLink into the dispensary procurement system for ordering reference."
  tags:
    - procurement
    - catalog
    - leaflink
capability:
  exposes:
    - type: mcp
      namespace: vendor-catalog
      port: 8080
      tools:
        - name: import-vendor-catalog
          description: "Import a vendor's product catalog from LeafLink."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The LeafLink vendor identifier."
          call: "leaflink.get-vendor-products"
          with:
            vendor_id: "{{vendor_id}}"
  consumes:
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: vendor-products
          path: "/vendors/{{vendor_id}}/products"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor-products
              method: GET

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

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at Curaleaf 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 Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.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.curaleaf.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Retrieves a wholesale invoice from LeafLink, creates a payment record in the accounting system, and sends payment confirmation via email through Twilio SendGrid.

naftiko: "0.5"
info:
  label: "Vendor Payment Processing"
  description: "Retrieves a wholesale invoice from LeafLink, creates a payment record in the accounting system, and sends payment confirmation via email through Twilio SendGrid."
  tags:
    - finance
    - payments
    - leaflink
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: vendor-payments
      port: 8080
      tools:
        - name: process-vendor-payment
          description: "Process payment for a wholesale vendor invoice."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The LeafLink invoice identifier."
            - name: payment_method
              in: body
              type: string
              description: "Payment method (ach, wire, check)."
          steps:
            - name: get-invoice
              type: call
              call: "leaflink.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: send-confirmation
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{get-invoice.vendor_email}}"
                subject: "Payment processed for invoice {{invoice_id}}"
                body: "Payment of {{get-invoice.total_amount}} via {{payment_method}} has been initiated for invoice {{invoice_id}}."
  consumes:
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST

Reviews vendors at Curaleaf.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at Curaleaf."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at Curaleaf."
          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.curaleaf.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.curaleaf.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.curaleaf.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

Records cannabis waste disposal events in Grow Flow, reports them to METRC for compliance, and logs the disposal as a ServiceNow change request.

naftiko: "0.5"
info:
  label: "Waste Disposal Reporting"
  description: "Records cannabis waste disposal events in Grow Flow, reports them to METRC for compliance, and logs the disposal as a ServiceNow change request."
  tags:
    - compliance
    - waste
    - growflow
    - metrc
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: waste-disposal
      port: 8080
      tools:
        - name: report-waste-disposal
          description: "Record and report a cannabis waste disposal event across compliance systems."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The batch identifier for the waste material."
            - name: weight_grams
              in: body
              type: number
              description: "Weight of waste in grams."
            - name: reason
              in: body
              type: string
              description: "Reason for disposal."
            - name: state_code
              in: body
              type: string
              description: "Two-letter state code."
          steps:
            - name: record-waste
              type: call
              call: "growflow.record-waste"
              with:
                batch_id: "{{batch_id}}"
                weight: "{{weight_grams}}"
                reason: "{{reason}}"
            - name: report-metrc
              type: call
              call: "metrc.report-waste"
              with:
                tag: "{{record-waste.metrc_tag}}"
                weight: "{{weight_grams}}"
                reason: "{{reason}}"
                state: "{{state_code}}"
            - name: log-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Waste disposal: batch {{batch_id}} - {{weight_grams}}g"
                description: "Reason: {{reason}}. METRC reported. Disposal ID: {{report-metrc.disposal_id}}."
  consumes:
    - type: http
      namespace: growflow
      baseUri: "https://api.growflow.com/v1"
      authentication:
        type: bearer
        token: "$secrets.growflow_token"
      resources:
        - name: waste
          path: "/batches/{{batch_id}}/waste"
          inputParameters:
            - name: batch_id
              in: path
          operations:
            - name: record-waste
              method: POST
    - type: http
      namespace: metrc
      baseUri: "https://api-{{state}}.metrc.com/packages/v1"
      authentication:
        type: basic
        username: "$secrets.metrc_vendor_key"
        password: "$secrets.metrc_user_key"
      resources:
        - name: waste
          path: "/waste"
          operations:
            - name: report-waste
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://curaleaf.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Checks the status of a wholesale cannabis order in LeafLink, returning order details, delivery schedule, and payment status.

naftiko: "0.5"
info:
  label: "Wholesale Order Status"
  description: "Checks the status of a wholesale cannabis order in LeafLink, returning order details, delivery schedule, and payment status."
  tags:
    - wholesale
    - orders
    - leaflink
capability:
  exposes:
    - type: mcp
      namespace: wholesale-orders
      port: 8080
      tools:
        - name: get-order-status
          description: "Look up a wholesale order by order number in LeafLink."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The LeafLink wholesale order number."
          call: "leaflink.get-order"
          with:
            order_number: "{{order_number}}"
  consumes:
    - type: http
      namespace: leaflink
      baseUri: "https://api.leaflink.com/v2"
      authentication:
        type: bearer
        token: "$secrets.leaflink_token"
      resources:
        - name: orders
          path: "/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET

Retrieves employee profile from Workday for Curaleaf.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for Curaleaf."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up Curaleaf 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.curaleaf.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

Checks Zendesk ticket at Curaleaf.

naftiko: "0.5"
info:
  label: "Zendesk Ticket Check"
  description: "Checks Zendesk ticket at Curaleaf."
  tags:
    - support
    - zendesk
    - ticketing
capability:
  exposes:
    - type: mcp
      namespace: zd-ticket
      port: 8080
      tools:
        - name: check-ticket
          description: "Check ticket at Curaleaf."
          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://curaleaf.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