Curaleaf Holdings Capabilities
Naftiko 0.5 capability definitions for Curaleaf Holdings - 100 capabilities showing integration workflows and service orchestrations.
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