Planet Fitness Capabilities
Naftiko 0.5 capability definitions for Planet Fitness - 100 capabilities showing integration workflows and service orchestrations.
Reconciles annual revenue by pulling membership dues from ABC Financial, retail sales from Square, personal training revenue from MINDBODY, and generating the consolidated report in NetSuite.
naftiko: "0.5"
info:
label: "Annual Revenue Reconciliation Orchestrator"
description: "Reconciles annual revenue by pulling membership dues from ABC Financial, retail sales from Square, personal training revenue from MINDBODY, and generating the consolidated report in NetSuite."
tags:
- finance
- reconciliation
- abc-financial
- square
- mindbody
- netsuite
capability:
exposes:
- type: mcp
namespace: finance-reconciliation
port: 8080
tools:
- name: reconcile-annual-revenue
description: "Given a club ID and fiscal year, pull revenue from all channels and create a consolidated report in NetSuite."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: fiscal_year
in: body
type: string
description: "Fiscal year (e.g., 2025)."
steps:
- name: get-membership-revenue
type: call
call: "abc-financial.get-annual-revenue"
with:
club_id: "{{club_id}}"
year: "{{fiscal_year}}"
- name: get-retail-revenue
type: call
call: "square.get-annual-sales"
with:
location_id: "{{club_id}}"
year: "{{fiscal_year}}"
- name: get-pt-revenue
type: call
call: "mindbody.get-annual-revenue"
with:
location_id: "{{club_id}}"
year: "{{fiscal_year}}"
- name: create-report
type: call
call: "netsuite.create-revenue-report"
with:
club_id: "{{club_id}}"
year: "{{fiscal_year}}"
membership_revenue: "{{get-membership-revenue.total}}"
retail_revenue: "{{get-retail-revenue.total}}"
pt_revenue: "{{get-pt-revenue.total}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: revenue
path: "/clubs/{{club_id}}/annual-revenue"
inputParameters:
- name: club_id
in: path
- name: year
in: query
operations:
- name: get-annual-revenue
method: GET
- type: http
namespace: square
baseUri: "https://connect.squareup.com/v2"
authentication:
type: bearer
token: "$secrets.square_access_token"
resources:
- name: sales
path: "/locations/{{location_id}}/transactions/summary"
inputParameters:
- name: location_id
in: path
- name: year
in: query
operations:
- name: get-annual-sales
method: GET
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
resources:
- name: revenue
path: "/site/revenue"
inputParameters:
- name: location_id
in: query
- name: year
in: query
operations:
- name: get-annual-revenue
method: GET
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: reports
path: "/customrecord_revenue_reconciliation"
operations:
- name: create-revenue-report
method: POST
Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Black Card Spa Amenity Lookup"
description: "Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems."
tags:
- black
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: black
port: 8080
tools:
- name: black-card-spa-amenity-lookup
description: "Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.black-card-spa-amenity-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/black/card/spa/amenity/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: black-card-spa-amenity-lookup
method: GET
Fetches the group fitness class schedule for a given club from the MINDBODY scheduling platform, returning class names, times, instructors, and available spots.
naftiko: "0.5"
info:
label: "Class Schedule Retrieval"
description: "Fetches the group fitness class schedule for a given club from the MINDBODY scheduling platform, returning class names, times, instructors, and available spots."
tags:
- scheduling
- fitness
- mindbody
capability:
exposes:
- type: mcp
namespace: scheduling
port: 8080
tools:
- name: get-class-schedule
description: "Retrieve the fitness class schedule for a specific club and date range from MINDBODY."
inputParameters:
- name: club_id
in: body
type: string
description: "The Planet Fitness club location identifier."
- name: date
in: body
type: string
description: "The schedule date in YYYY-MM-DD format."
call: "mindbody.get-classes"
with:
location_id: "{{club_id}}"
start_date: "{{date}}"
outputParameters:
- name: classes
type: string
mapping: "$.Classes"
consumes:
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
inputParameters:
- name: Api-Key
in: header
value: "$secrets.mindbody_api_key"
- name: SiteId
in: header
value: "$secrets.mindbody_site_id"
resources:
- name: classes
path: "/class/classes"
inputParameters:
- name: location_id
in: query
- name: start_date
in: query
operations:
- name: get-classes
method: GET
Retrieves club access log lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Club Access Log Lookup"
description: "Retrieves club access log lookup data from the Planet Fitness fitness franchise systems."
tags:
- club
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-access-log-lookup
description: "Retrieves club access log lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.club-access-log-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/club/access/log/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: club-access-log-lookup
method: GET
Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Capacity Management Pipeline"
description: "Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- planet-fitness
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-capacity-management-pipeline
description: "Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "planet-fitness.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "servicenow.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "salesforce.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Generates and distributes the daily cleaning schedule by pulling staff assignments from ADP, creating tasks in ServiceChannel, and posting the schedule to the club's Slack channel.
naftiko: "0.5"
info:
label: "Club Cleaning Schedule Orchestrator"
description: "Generates and distributes the daily cleaning schedule by pulling staff assignments from ADP, creating tasks in ServiceChannel, and posting the schedule to the club's Slack channel."
tags:
- operations
- cleaning
- adp
- servicechannel
- slack
capability:
exposes:
- type: mcp
namespace: club-cleaning
port: 8080
tools:
- name: generate-cleaning-schedule
description: "Given a club ID and date, pull staff, create cleaning tasks, and post schedule to Slack."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: date
in: body
type: string
description: "Schedule date in YYYY-MM-DD format."
steps:
- name: get-staff
type: call
call: "adp.get-scheduled-staff"
with:
location: "{{club_id}}"
date: "{{date}}"
- name: create-tasks
type: call
call: "servicechannel.create-cleaning-tasks"
with:
location_id: "{{club_id}}"
date: "{{date}}"
staff_count: "{{get-staff.count}}"
- name: post-schedule
type: call
call: "slack.post-message"
with:
channel: "#club-{{club_id}}-ops"
text: "Cleaning schedule for {{date}}: {{get-staff.count}} staff assigned. Tasks created: {{create-tasks.task_count}}."
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/time/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: schedules
path: "/locations/{{location}}/schedules"
inputParameters:
- name: location
in: path
- name: date
in: query
operations:
- name: get-scheduled-staff
method: GET
- type: http
namespace: servicechannel
baseUri: "https://api.servicechannel.com/v3"
authentication:
type: bearer
token: "$secrets.servicechannel_token"
resources:
- name: cleaning
path: "/cleaning-tasks"
operations:
- name: create-cleaning-tasks
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 club cleanliness score lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Club Cleanliness Score Lookup"
description: "Retrieves club cleanliness score lookup data from the Planet Fitness fitness franchise systems."
tags:
- club
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-cleanliness-score-lookup
description: "Retrieves club cleanliness score lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.club-cleanliness-score-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/club/cleanliness/score/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: club-cleanliness-score-lookup
method: GET
Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Emergency Drill Coordinator"
description: "Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- servicenow
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-emergency-drill-coordinator
description: "Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "servicenow.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "salesforce.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Energy Management Optimizer"
description: "Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- sendgrid
- workday
- datadog
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-energy-management-optimizer
description: "Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "sendgrid.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "workday.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Creates a maintenance work order in ServiceChannel for a specific piece of gym equipment, including equipment tag, issue description, and club location.
naftiko: "0.5"
info:
label: "Club Equipment Maintenance Ticket"
description: "Creates a maintenance work order in ServiceChannel for a specific piece of gym equipment, including equipment tag, issue description, and club location."
tags:
- facilities
- maintenance
- servicechannel
capability:
exposes:
- type: mcp
namespace: facilities
port: 8080
tools:
- name: create-equipment-ticket
description: "Submit a maintenance work order for gym equipment to ServiceChannel."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: equipment_tag
in: body
type: string
description: "The asset tag of the equipment needing repair."
- name: issue_description
in: body
type: string
description: "Description of the equipment issue."
call: "servicechannel.create-work-order"
with:
location_id: "{{club_id}}"
asset_tag: "{{equipment_tag}}"
description: "{{issue_description}}"
outputParameters:
- name: work_order_id
type: string
mapping: "$.data.work_order_id"
- name: status
type: string
mapping: "$.data.status"
consumes:
- type: http
namespace: servicechannel
baseUri: "https://api.servicechannel.com/v3"
authentication:
type: bearer
token: "$secrets.servicechannel_token"
resources:
- name: work-orders
path: "/workorders"
operations:
- name: create-work-order
method: POST
Checks the status of an HVAC maintenance work order in ServiceChannel, returning current status, assigned vendor, and estimated completion date.
naftiko: "0.5"
info:
label: "Club HVAC Work Order Status"
description: "Checks the status of an HVAC maintenance work order in ServiceChannel, returning current status, assigned vendor, and estimated completion date."
tags:
- facilities
- maintenance
- servicechannel
capability:
exposes:
- type: mcp
namespace: facilities
port: 8080
tools:
- name: get-work-order-status
description: "Retrieve the current status of a facilities work order from ServiceChannel."
inputParameters:
- name: work_order_id
in: body
type: string
description: "The ServiceChannel work order ID."
call: "servicechannel.get-work-order"
with:
work_order_id: "{{work_order_id}}"
outputParameters:
- name: status
type: string
mapping: "$.data.status"
- name: vendor
type: string
mapping: "$.data.assigned_vendor"
- name: eta
type: string
mapping: "$.data.estimated_completion"
consumes:
- type: http
namespace: servicechannel
baseUri: "https://api.servicechannel.com/v3"
authentication:
type: bearer
token: "$secrets.servicechannel_token"
resources:
- name: work-orders
path: "/workorders/{{work_order_id}}"
inputParameters:
- name: work_order_id
in: path
operations:
- name: get-work-order
method: GET
Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Insurance Renewal Pipeline"
description: "Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- sendgrid
- workday
- datadog
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-insurance-renewal-pipeline
description: "Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "sendgrid.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "workday.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Retrieves lease document details for a franchise location from the document management system in Box, returning document name, lease expiration date, and download link.
naftiko: "0.5"
info:
label: "Club Lease Document Lookup"
description: "Retrieves lease document details for a franchise location from the document management system in Box, returning document name, lease expiration date, and download link."
tags:
- franchise
- legal
- box
capability:
exposes:
- type: mcp
namespace: legal-docs
port: 8080
tools:
- name: get-lease-document
description: "Retrieve lease document metadata for a franchise club from Box."
inputParameters:
- name: club_id
in: body
type: string
description: "The franchise club identifier."
call: "box.search-files"
with:
query: "lease_{{club_id}}"
type: "file"
outputParameters:
- name: file_name
type: string
mapping: "$.entries[0].name"
- name: download_url
type: string
mapping: "$.entries[0].shared_link.download_url"
consumes:
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: search
path: "/search"
inputParameters:
- name: query
in: query
- name: type
in: query
operations:
- name: search-files
method: GET
Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Lost And Found Management Pipeline"
description: "Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- datadog
- planet-fitness
- servicenow
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-lost-and-found-management-pipeline
description: "Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "planet-fitness.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "servicenow.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Maintenance Preventive Scheduler"
description: "Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- salesforce
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-maintenance-preventive-scheduler
description: "Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "salesforce.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Queries the real-time occupancy count for a specific Planet Fitness club from the crowd monitoring system, returning current headcount and percentage capacity.
naftiko: "0.5"
info:
label: "Club Occupancy Check"
description: "Queries the real-time occupancy count for a specific Planet Fitness club from the crowd monitoring system, returning current headcount and percentage capacity."
tags:
- operations
- occupancy
- crowd-monitoring
capability:
exposes:
- type: mcp
namespace: club-operations
port: 8080
tools:
- name: get-club-occupancy
description: "Retrieve real-time occupancy data for a Planet Fitness club location."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
call: "crowd-monitor.get-occupancy"
with:
location_id: "{{club_id}}"
outputParameters:
- name: current_count
type: string
mapping: "$.data.current_occupancy"
- name: max_capacity
type: string
mapping: "$.data.max_capacity"
- name: percent_full
type: string
mapping: "$.data.occupancy_percentage"
consumes:
- type: http
namespace: crowd-monitor
baseUri: "https://api.planetfitness.com/internal/crowd/v1"
authentication:
type: bearer
token: "$secrets.crowd_api_token"
resources:
- name: occupancy
path: "/locations/{{location_id}}/occupancy"
inputParameters:
- name: location_id
in: path
operations:
- name: get-occupancy
method: GET
When a new franchise club nears opening, creates a project in Asana with all pre-opening tasks, sends franchise welcome kit details from NetSuite, and creates the club profile in Club OS.
naftiko: "0.5"
info:
label: "Club Opening Checklist Orchestrator"
description: "When a new franchise club nears opening, creates a project in Asana with all pre-opening tasks, sends franchise welcome kit details from NetSuite, and creates the club profile in Club OS."
tags:
- franchise
- operations
- asana
- netsuite
- club-os
capability:
exposes:
- type: mcp
namespace: franchise-ops
port: 8080
tools:
- name: initialize-club-opening
description: "Given a new club ID and opening date, create project plan in Asana, dispatch welcome kit from NetSuite, and set up CRM profile in Club OS."
inputParameters:
- name: club_id
in: body
type: string
description: "The new franchise club identifier."
- name: club_name
in: body
type: string
description: "The new club display name."
- name: opening_date
in: body
type: string
description: "Planned opening date in YYYY-MM-DD format."
steps:
- name: create-project
type: call
call: "asana.create-project"
with:
name: "Club Opening: {{club_name}} ({{club_id}})"
due_date: "{{opening_date}}"
template: "club_opening_template"
- name: dispatch-kit
type: call
call: "netsuite.create-sales-order"
with:
item: "franchise_welcome_kit"
ship_to: "{{club_id}}"
required_date: "{{opening_date}}"
- name: setup-crm
type: call
call: "club-os.create-location"
with:
club_id: "{{club_id}}"
name: "{{club_name}}"
consumes:
- type: http
namespace: asana
baseUri: "https://app.asana.com/api/1.0"
authentication:
type: bearer
token: "$secrets.asana_token"
resources:
- name: projects
path: "/projects"
operations:
- name: create-project
method: POST
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: sales-orders
path: "/salesOrder"
operations:
- name: create-sales-order
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: locations
path: "/locations"
operations:
- name: create-location
method: POST
Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Opening Marketing Campaign Pipeline"
description: "Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- jira
- teams
- sendgrid
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-opening-marketing-campaign-pipeline
description: "Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "teams.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "sendgrid.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Parking Lot Maintenance Pipeline"
description: "Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- salesforce
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-parking-lot-maintenance-pipeline
description: "Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "salesforce.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Aggregates key performance metrics for a club by pulling membership count from ABC Financial, revenue from NetSuite, NPS score from SurveyMonkey, and posts the daily summary to Slack.
naftiko: "0.5"
info:
label: "Club Performance Dashboard Data Orchestrator"
description: "Aggregates key performance metrics for a club by pulling membership count from ABC Financial, revenue from NetSuite, NPS score from SurveyMonkey, and posts the daily summary to Slack."
tags:
- operations
- analytics
- abc-financial
- netsuite
- surveymonkey
- slack
capability:
exposes:
- type: mcp
namespace: club-dashboard
port: 8080
tools:
- name: generate-daily-dashboard
description: "Given a club ID and date, aggregate KPIs from billing, finance, and feedback systems, then post a summary to Slack."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: date
in: body
type: string
description: "The reporting date in YYYY-MM-DD format."
steps:
- name: get-member-count
type: call
call: "abc-financial.get-member-count"
with:
club_id: "{{club_id}}"
- name: get-daily-revenue
type: call
call: "netsuite.get-daily-revenue"
with:
club_id: "{{club_id}}"
date: "{{date}}"
- name: get-nps
type: call
call: "surveymonkey.get-nps-score"
with:
club_id: "{{club_id}}"
- name: post-dashboard
type: call
call: "slack.post-message"
with:
channel: "#club-{{club_id}}-ops"
text: "Daily Dashboard ({{date}}):\nMembers: {{get-member-count.active_count}}\nRevenue: ${{get-daily-revenue.amount}}\nNPS: {{get-nps.score}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: member-count
path: "/clubs/{{club_id}}/members/count"
inputParameters:
- name: club_id
in: path
operations:
- name: get-member-count
method: GET
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: revenue
path: "/customrecord_daily_revenue"
inputParameters:
- name: club_id
in: query
- name: date
in: query
operations:
- name: get-daily-revenue
method: GET
- type: http
namespace: surveymonkey
baseUri: "https://api.surveymonkey.com/v3"
authentication:
type: bearer
token: "$secrets.surveymonkey_token"
resources:
- name: nps
path: "/surveys/nps/responses"
inputParameters:
- name: club_id
in: query
operations:
- name: get-nps-score
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Pest Control Scheduling Pipeline"
description: "Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- workday
- datadog
- planet-fitness
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-pest-control-scheduling-pipeline
description: "Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "workday.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "planet-fitness.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Club Revenue Per Member Lookup"
description: "Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems."
tags:
- club
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-revenue-per-member-lookup
description: "Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.club-revenue-per-member-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/club/revenue/per/member/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: club-revenue-per-member-lookup
method: GET
Retrieves club security camera status data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Club Security Camera Status"
description: "Retrieves club security camera status data from the Planet Fitness fitness franchise systems."
tags:
- club
- planet-fitness
- status
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-security-camera-status
description: "Retrieves club security camera status data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.club-security-camera-status"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/club/security/camera/status/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: club-security-camera-status
method: GET
Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Signage Update Pipeline"
description: "Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- slack
- jira
- teams
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-signage-update-pipeline
description: "Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "teams.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Retrieves club staffing level check data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Club Staffing Level Check"
description: "Retrieves club staffing level check data from the Planet Fitness fitness franchise systems."
tags:
- club
- planet-fitness
- check
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-staffing-level-check
description: "Retrieves club staffing level check data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.club-staffing-level-check"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/club/staffing/level/check/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: club-staffing-level-check
method: GET
Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Club Water Fountain Maintenance Pipeline"
description: "Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- club
- planet-fitness
- slack
- jira
- teams
capability:
exposes:
- type: mcp
namespace: club
port: 8080
tools:
- name: club-water-fountain-maintenance-pipeline
description: "Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "teams.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/club"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/club"
operations:
- name: execute-2
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/club"
operations:
- name: execute-3
method: POST
Pulls Wi-Fi usage analytics for a club from the network management platform, returning unique device connections, peak usage hours, and bandwidth consumption.
naftiko: "0.5"
info:
label: "Club Wi-Fi Usage Report"
description: "Pulls Wi-Fi usage analytics for a club from the network management platform, returning unique device connections, peak usage hours, and bandwidth consumption."
tags:
- operations
- it-support
- network
capability:
exposes:
- type: mcp
namespace: network-analytics
port: 8080
tools:
- name: get-wifi-usage
description: "Retrieve Wi-Fi usage analytics for a Planet Fitness club."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: date
in: body
type: string
description: "Report date in YYYY-MM-DD format."
call: "network-mgmt.get-wifi-stats"
with:
site_id: "{{club_id}}"
date: "{{date}}"
outputParameters:
- name: unique_devices
type: string
mapping: "$.data.uniqueDevices"
- name: peak_hour
type: string
mapping: "$.data.peakUsageHour"
- name: bandwidth_gb
type: string
mapping: "$.data.bandwidthConsumedGB"
consumes:
- type: http
namespace: network-mgmt
baseUri: "https://api.planetfitness.com/internal/network/v1"
authentication:
type: bearer
token: "$secrets.network_mgmt_token"
resources:
- name: wifi-stats
path: "/sites/{{site_id}}/wifi-stats"
inputParameters:
- name: site_id
in: path
- name: date
in: query
operations:
- name: get-wifi-stats
method: GET
Enrolls a corporate partnership member by creating their account in ABC Financial with the corporate discount, setting up their Club OS profile, and notifying the corporate account manager in Salesforce.
naftiko: "0.5"
info:
label: "Corporate Membership Enrollment Orchestrator"
description: "Enrolls a corporate partnership member by creating their account in ABC Financial with the corporate discount, setting up their Club OS profile, and notifying the corporate account manager in Salesforce."
tags:
- membership
- corporate
- abc-financial
- club-os
- salesforce
capability:
exposes:
- type: mcp
namespace: corporate-membership
port: 8080
tools:
- name: enroll-corporate-member
description: "Given employee details and corporate account ID, create discounted membership, set up CRM profile, and update the corporate account in Salesforce."
inputParameters:
- name: first_name
in: body
type: string
description: "Employee first name."
- name: last_name
in: body
type: string
description: "Employee last name."
- name: email
in: body
type: string
description: "Employee email address."
- name: corporate_account_id
in: body
type: string
description: "The Salesforce corporate account ID."
- name: club_id
in: body
type: string
description: "The home club location."
steps:
- name: create-membership
type: call
call: "abc-financial.create-corporate-member"
with:
first_name: "{{first_name}}"
last_name: "{{last_name}}"
email: "{{email}}"
corporate_id: "{{corporate_account_id}}"
club_id: "{{club_id}}"
- name: create-crm-profile
type: call
call: "club-os.create-member"
with:
first_name: "{{first_name}}"
last_name: "{{last_name}}"
email: "{{email}}"
club_id: "{{club_id}}"
source: "corporate"
- name: update-account
type: call
call: "salesforce.update-account"
with:
account_id: "{{corporate_account_id}}"
member_count_increment: "1"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: corporate-members
path: "/corporate/members"
operations:
- name: create-corporate-member
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members"
operations:
- name: create-member
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Identifies a past-due member in ABC Financial, sends a payment reminder via Mailchimp transactional email, creates a follow-up task in Club OS, and escalates to collections if overdue beyond threshold.
naftiko: "0.5"
info:
label: "Delinquent Member Recovery Orchestrator"
description: "Identifies a past-due member in ABC Financial, sends a payment reminder via Mailchimp transactional email, creates a follow-up task in Club OS, and escalates to collections if overdue beyond threshold."
tags:
- billing
- collections
- abc-financial
- mailchimp
- club-os
capability:
exposes:
- type: mcp
namespace: collections
port: 8080
tools:
- name: recover-delinquent-member
description: "Given a past-due member ID, send payment reminder, create CRM follow-up, and escalate if needed."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID."
- name: days_overdue
in: body
type: string
description: "Number of days the member is past due."
steps:
- name: get-billing-info
type: call
call: "abc-financial.get-payment-status"
with:
member_id: "{{member_id}}"
- name: send-reminder
type: call
call: "mailchimp.send-transactional"
with:
template: "payment_reminder"
email: "{{get-billing-info.email}}"
merge_vars_amount: "{{get-billing-info.past_due_balance}}"
- name: create-followup
type: call
call: "club-os.create-task"
with:
member_id: "{{member_id}}"
task: "Follow up on past-due balance of ${{get-billing-info.past_due_balance}}. Days overdue: {{days_overdue}}."
- name: escalate-collections
type: call
call: "abc-financial.escalate-to-collections"
with:
member_id: "{{member_id}}"
balance: "{{get-billing-info.past_due_balance}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: payments
path: "/members/{{member_id}}/payments"
inputParameters:
- name: member_id
in: path
operations:
- name: get-payment-status
method: GET
- name: collections
path: "/members/{{member_id}}/collections"
inputParameters:
- name: member_id
in: path
operations:
- name: escalate-to-collections
method: POST
- type: http
namespace: mailchimp
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: bearer
token: "$secrets.mandrill_api_key"
resources:
- name: transactional
path: "/messages/send-template"
operations:
- name: send-transactional
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: tasks
path: "/members/{{member_id}}/tasks"
inputParameters:
- name: member_id
in: path
operations:
- name: create-task
method: POST
Updates in-club digital signage content by uploading a new creative asset to the DAM, pushing the content playlist update to the signage platform, and logging the change in Asana.
naftiko: "0.5"
info:
label: "Digital Signage Content Update Orchestrator"
description: "Updates in-club digital signage content by uploading a new creative asset to the DAM, pushing the content playlist update to the signage platform, and logging the change in Asana."
tags:
- marketing
- signage
- dam
- asana
capability:
exposes:
- type: mcp
namespace: signage
port: 8080
tools:
- name: update-signage-content
description: "Given a creative asset URL, club ID, and playlist zone, upload asset to DAM, push to signage platform, and log the update in Asana."
inputParameters:
- name: asset_url
in: body
type: string
description: "URL of the creative asset to upload."
- name: club_id
in: body
type: string
description: "Target club location."
- name: zone
in: body
type: string
description: "Signage display zone (lobby, cardio_floor, weight_room)."
steps:
- name: upload-asset
type: call
call: "dam.upload-asset"
with:
source_url: "{{asset_url}}"
folder: "signage/{{club_id}}/{{zone}}"
- name: push-playlist
type: call
call: "signage-platform.update-playlist"
with:
location_id: "{{club_id}}"
zone: "{{zone}}"
asset_id: "{{upload-asset.asset_id}}"
- name: log-change
type: call
call: "asana.create-task"
with:
project: "signage_updates"
name: "Signage updated: {{club_id}} / {{zone}}"
notes: "Asset {{upload-asset.asset_id}} deployed to {{zone}} at club {{club_id}}."
consumes:
- type: http
namespace: dam
baseUri: "https://dam.planetfitness.com/api/v1"
authentication:
type: bearer
token: "$secrets.dam_token"
resources:
- name: assets
path: "/assets"
operations:
- name: upload-asset
method: POST
- type: http
namespace: signage-platform
baseUri: "https://api.signagelive.com/v1"
authentication:
type: bearer
token: "$secrets.signage_token"
resources:
- name: playlists
path: "/locations/{{location_id}}/playlists"
inputParameters:
- name: location_id
in: path
operations:
- name: update-playlist
method: PUT
- type: http
namespace: asana
baseUri: "https://app.asana.com/api/1.0"
authentication:
type: bearer
token: "$secrets.asana_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
method: POST
Sets up an A/B test email campaign in Mailchimp for a membership promotion, tracks open rates via Mailchimp reports, and logs the winning variant results in HubSpot.
naftiko: "0.5"
info:
label: "Email Campaign A/B Test Orchestrator"
description: "Sets up an A/B test email campaign in Mailchimp for a membership promotion, tracks open rates via Mailchimp reports, and logs the winning variant results in HubSpot."
tags:
- marketing
- email
- mailchimp
- hubspot
capability:
exposes:
- type: mcp
namespace: email-marketing
port: 8080
tools:
- name: run-ab-test-campaign
description: "Given two subject lines and a target segment, create an A/B test campaign in Mailchimp, then log results in HubSpot."
inputParameters:
- name: subject_a
in: body
type: string
description: "Subject line for variant A."
- name: subject_b
in: body
type: string
description: "Subject line for variant B."
- name: segment_id
in: body
type: string
description: "The Mailchimp segment to target."
- name: campaign_id
in: body
type: string
description: "HubSpot campaign ID for logging."
steps:
- name: create-ab-campaign
type: call
call: "mailchimp.create-ab-campaign"
with:
subject_a: "{{subject_a}}"
subject_b: "{{subject_b}}"
segment_id: "{{segment_id}}"
- name: get-results
type: call
call: "mailchimp.get-campaign-report"
with:
campaign_id: "{{create-ab-campaign.campaign_id}}"
- name: log-results
type: call
call: "hubspot.create-activity"
with:
campaign_id: "{{campaign_id}}"
note: "A/B test winner: {{get-results.winning_variant}}. Open rate: {{get-results.open_rate}}%."
consumes:
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: create-ab-campaign
method: POST
- name: reports
path: "/reports/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-report
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: activities
path: "/engagements/v1/engagements"
operations:
- name: create-activity
method: POST
When a new hire is approved, creates the employee record in ADP Workforce Now, provisions their club access badge, and sends a welcome email via Mailchimp with onboarding instructions.
naftiko: "0.5"
info:
label: "Employee Hiring Orchestrator"
description: "When a new hire is approved, creates the employee record in ADP Workforce Now, provisions their club access badge, and sends a welcome email via Mailchimp with onboarding instructions."
tags:
- hr
- hiring
- adp
- mailchimp
capability:
exposes:
- type: mcp
namespace: hr-hiring
port: 8080
tools:
- name: onboard-new-hire
description: "Given new hire details, create ADP record, provision badge, and send welcome email."
inputParameters:
- name: first_name
in: body
type: string
description: "New hire first name."
- name: last_name
in: body
type: string
description: "New hire last name."
- name: email
in: body
type: string
description: "New hire email address."
- name: club_id
in: body
type: string
description: "Assigned club location."
- name: start_date
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: create-employee
type: call
call: "adp.create-worker"
with:
first_name: "{{first_name}}"
last_name: "{{last_name}}"
email: "{{email}}"
location_code: "{{club_id}}"
start_date: "{{start_date}}"
- name: provision-badge
type: call
call: "access-control.create-badge"
with:
employee_id: "{{create-employee.associate_oid}}"
club_id: "{{club_id}}"
name: "{{first_name}} {{last_name}}"
- name: send-welcome
type: call
call: "mailchimp.send-transactional"
with:
template: "employee_welcome"
email: "{{email}}"
merge_vars_name: "{{first_name}}"
merge_vars_club: "{{club_id}}"
merge_vars_start: "{{start_date}}"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/hr/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: workers
path: "/workers"
operations:
- name: create-worker
method: POST
- type: http
namespace: access-control
baseUri: "https://api.planetfitness.com/internal/access/v1"
authentication:
type: bearer
token: "$secrets.access_control_token"
resources:
- name: badges
path: "/badges"
operations:
- name: create-badge
method: POST
- type: http
namespace: mailchimp
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: bearer
token: "$secrets.mandrill_api_key"
resources:
- name: transactional
path: "/messages/send-template"
operations:
- name: send-transactional
method: POST
Retrieves a payroll summary for a given employee from ADP Workforce Now, returning gross pay, net pay, deductions, and pay period.
naftiko: "0.5"
info:
label: "Employee Payroll Summary Lookup"
description: "Retrieves a payroll summary for a given employee from ADP Workforce Now, returning gross pay, net pay, deductions, and pay period."
tags:
- hr
- payroll
- adp
capability:
exposes:
- type: mcp
namespace: hr-payroll
port: 8080
tools:
- name: get-payroll-summary
description: "Look up the most recent payroll summary for a Planet Fitness employee from ADP."
inputParameters:
- name: employee_id
in: body
type: string
description: "The ADP associate OID."
call: "adp.get-pay-statement"
with:
associate_oid: "{{employee_id}}"
outputParameters:
- name: gross_pay
type: string
mapping: "$.payStatements[0].grossPay.amount"
- name: net_pay
type: string
mapping: "$.payStatements[0].netPay.amount"
- name: pay_period
type: string
mapping: "$.payStatements[0].payPeriod"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/payroll/v1"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: pay-statements
path: "/workers/{{associate_oid}}/pay-statements"
inputParameters:
- name: associate_oid
in: path
operations:
- name: get-pay-statement
method: GET
Retrieves the upcoming shift schedule for a club employee from ADP Workforce Now, returning shift dates, times, and assigned club location.
naftiko: "0.5"
info:
label: "Employee Shift Schedule Lookup"
description: "Retrieves the upcoming shift schedule for a club employee from ADP Workforce Now, returning shift dates, times, and assigned club location."
tags:
- hr
- scheduling
- adp
capability:
exposes:
- type: mcp
namespace: hr-scheduling
port: 8080
tools:
- name: get-employee-shifts
description: "Look up upcoming shift schedule for a Planet Fitness employee from ADP Workforce Now."
inputParameters:
- name: employee_id
in: body
type: string
description: "The ADP associate OID."
- name: week_start
in: body
type: string
description: "Start of the week in YYYY-MM-DD format."
call: "adp.get-schedule"
with:
associate_oid: "{{employee_id}}"
start_date: "{{week_start}}"
outputParameters:
- name: shifts
type: string
mapping: "$.schedules"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/time/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: schedules
path: "/workers/{{associate_oid}}/time-off-requests"
inputParameters:
- name: associate_oid
in: path
- name: start_date
in: query
operations:
- name: get-schedule
method: GET
Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Equipment Lifecycle Replacement Pipeline"
description: "Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- equipment
- planet-fitness
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: equipment
port: 8080
tools:
- name: equipment-lifecycle-replacement-pipeline
description: "Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/equipment"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/equipment"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/equipment"
operations:
- name: execute-3
method: POST
Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Equipment Warranty Status Check"
description: "Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems."
tags:
- equipment
- planet-fitness
- check
capability:
exposes:
- type: mcp
namespace: equipment
port: 8080
tools:
- name: equipment-warranty-status-check
description: "Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.equipment-warranty-status-check"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/equipment/warranty/status/check/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: equipment-warranty-status-check
method: GET
When a franchise agreement approaches renewal, pulls the current agreement from NetSuite, generates a renewal proposal, sends it via DocuSign for signature, and updates the franchise record in Salesforce.
naftiko: "0.5"
info:
label: "Franchise Agreement Renewal Orchestrator"
description: "When a franchise agreement approaches renewal, pulls the current agreement from NetSuite, generates a renewal proposal, sends it via DocuSign for signature, and updates the franchise record in Salesforce."
tags:
- franchise
- legal
- netsuite
- docusign
- salesforce
capability:
exposes:
- type: mcp
namespace: franchise-renewals
port: 8080
tools:
- name: process-franchise-renewal
description: "Given a franchise club ID, pull agreement, generate renewal, send for signature, and update CRM."
inputParameters:
- name: club_id
in: body
type: string
description: "The franchise club identifier."
- name: renewal_term_years
in: body
type: string
description: "Renewal term in years."
steps:
- name: get-agreement
type: call
call: "netsuite.get-franchise-agreement"
with:
club_id: "{{club_id}}"
- name: generate-renewal
type: call
call: "netsuite.create-renewal-proposal"
with:
club_id: "{{club_id}}"
current_agreement: "{{get-agreement.agreement_id}}"
term_years: "{{renewal_term_years}}"
- name: send-for-signature
type: call
call: "docusign.create-envelope"
with:
template_id: "franchise_renewal"
signer_email: "{{get-agreement.franchisee_email}}"
signer_name: "{{get-agreement.franchisee_name}}"
- name: update-salesforce
type: call
call: "salesforce.update-opportunity"
with:
club_id: "{{club_id}}"
stage: "Renewal Sent"
docusign_envelope: "{{send-for-signature.envelope_id}}"
consumes:
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: agreements
path: "/customrecord_franchise_agreement"
inputParameters:
- name: club_id
in: query
operations:
- name: get-franchise-agreement
method: GET
- name: renewals
path: "/customrecord_franchise_renewal"
operations:
- name: create-renewal-proposal
method: POST
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/{{account_id}}/envelopes"
inputParameters:
- name: account_id
in: path
operations:
- name: create-envelope
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: update-opportunity
method: PATCH
Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Audit Preparation Pipeline"
description: "Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- datadog
- planet-fitness
- servicenow
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-audit-preparation-pipeline
description: "Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "planet-fitness.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "servicenow.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Communication Broadcast Pipeline"
description: "Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- servicenow
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-communication-broadcast-pipeline
description: "Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "servicenow.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "salesforce.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Triggers a franchise compliance check by pulling the club inspection results from ServiceChannel, verifying brand standards from the franchise portal, and filing findings in Salesforce as a case.
naftiko: "0.5"
info:
label: "Franchise Compliance Audit Orchestrator"
description: "Triggers a franchise compliance check by pulling the club inspection results from ServiceChannel, verifying brand standards from the franchise portal, and filing findings in Salesforce as a case."
tags:
- franchise
- compliance
- servicechannel
- salesforce
capability:
exposes:
- type: mcp
namespace: franchise-compliance
port: 8080
tools:
- name: run-compliance-audit
description: "Given a franchise club ID, pull inspection data, verify brand standards, and log compliance findings in Salesforce."
inputParameters:
- name: club_id
in: body
type: string
description: "The franchise club identifier."
- name: audit_date
in: body
type: string
description: "The audit date in YYYY-MM-DD format."
steps:
- name: get-inspections
type: call
call: "servicechannel.get-inspections"
with:
location_id: "{{club_id}}"
date: "{{audit_date}}"
- name: get-brand-standards
type: call
call: "franchise-portal.get-standards"
with:
club_id: "{{club_id}}"
- name: file-findings
type: call
call: "salesforce.create-case"
with:
subject: "Compliance audit for club {{club_id}} on {{audit_date}}"
description: "Inspection score: {{get-inspections.overall_score}}. Brand standard compliance: {{get-brand-standards.compliance_status}}."
type: "Franchise_Compliance"
consumes:
- type: http
namespace: servicechannel
baseUri: "https://api.servicechannel.com/v3"
authentication:
type: bearer
token: "$secrets.servicechannel_token"
resources:
- name: inspections
path: "/locations/{{location_id}}/inspections"
inputParameters:
- name: location_id
in: path
- name: date
in: query
operations:
- name: get-inspections
method: GET
- type: http
namespace: franchise-portal
baseUri: "https://franchise.planetfitness.com/api/v1"
authentication:
type: bearer
token: "$secrets.franchise_portal_token"
resources:
- name: standards
path: "/clubs/{{club_id}}/brand-standards"
inputParameters:
- name: club_id
in: path
operations:
- name: get-standards
method: GET
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Expansion Feasibility Pipeline"
description: "Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- planet-fitness
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-expansion-feasibility-pipeline
description: "Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "planet-fitness.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "servicenow.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "salesforce.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Franchise Fee Calculation Lookup"
description: "Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems."
tags:
- franchise
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-fee-calculation-lookup
description: "Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.franchise-fee-calculation-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/franchise/fee/calculation/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: franchise-fee-calculation-lookup
method: GET
When a new franchise inquiry arrives in Salesforce, enriches the lead with ZoomInfo data, assigns it to a franchise development rep based on territory, and sends a Slack notification to the franchise team.
naftiko: "0.5"
info:
label: "Franchise Lead Assignment Orchestrator"
description: "When a new franchise inquiry arrives in Salesforce, enriches the lead with ZoomInfo data, assigns it to a franchise development rep based on territory, and sends a Slack notification to the franchise team."
tags:
- franchise
- sales
- salesforce
- zoominfo
- slack
capability:
exposes:
- type: mcp
namespace: franchise-leads
port: 8080
tools:
- name: assign-franchise-lead
description: "Given a Salesforce lead ID, enrich it with ZoomInfo, assign to territory rep, and notify the franchise team in Slack."
inputParameters:
- name: lead_id
in: body
type: string
description: "The Salesforce lead record ID."
- name: territory_code
in: body
type: string
description: "The franchise territory code for assignment."
steps:
- name: get-lead
type: call
call: "salesforce.get-lead"
with:
lead_id: "{{lead_id}}"
- name: enrich-lead
type: call
call: "zoominfo.enrich-contact"
with:
email: "{{get-lead.Email}}"
company: "{{get-lead.Company}}"
- name: assign-rep
type: call
call: "salesforce.update-lead"
with:
lead_id: "{{lead_id}}"
owner_territory: "{{territory_code}}"
company_revenue: "{{enrich-lead.revenue}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#franchise-development"
text: "New franchise lead: {{get-lead.FirstName}} {{get-lead.LastName}} ({{get-lead.Company}}), revenue: {{enrich-lead.revenue}}, territory: {{territory_code}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- name: update-lead
method: PATCH
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: contacts
path: "/enrich/contact"
operations:
- name: enrich-contact
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
Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Legal Compliance Checker"
description: "Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- teams
- sendgrid
- workday
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-legal-compliance-checker
description: "Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "teams.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "sendgrid.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "workday.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Performance Benchmarking Pipeline"
description: "Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- planet-fitness
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-performance-benchmarking-pipeline
description: "Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "planet-fitness.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "servicenow.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "salesforce.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Retrieves a franchise location's gross revenue from ABC Financial and calculates the royalty fee based on the franchise agreement terms stored in NetSuite.
naftiko: "0.5"
info:
label: "Franchise Royalty Fee Calculator"
description: "Retrieves a franchise location's gross revenue from ABC Financial and calculates the royalty fee based on the franchise agreement terms stored in NetSuite."
tags:
- franchise
- finance
- abc-financial
- netsuite
capability:
exposes:
- type: mcp
namespace: franchise-finance
port: 8080
tools:
- name: calculate-royalty-fee
description: "Given a franchise club ID and billing period, retrieve revenue from ABC Financial and royalty rate from NetSuite, then compute the fee."
inputParameters:
- name: club_id
in: body
type: string
description: "The franchise club identifier."
- name: billing_period
in: body
type: string
description: "The billing period in YYYY-MM format."
steps:
- name: get-revenue
type: call
call: "abc-financial.get-club-revenue"
with:
club_id: "{{club_id}}"
period: "{{billing_period}}"
- name: get-agreement
type: call
call: "netsuite.get-franchise-agreement"
with:
club_id: "{{club_id}}"
- name: post-royalty
type: call
call: "netsuite.create-royalty-invoice"
with:
club_id: "{{club_id}}"
gross_revenue: "{{get-revenue.total_revenue}}"
royalty_rate: "{{get-agreement.royalty_percentage}}"
period: "{{billing_period}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: club-revenue
path: "/clubs/{{club_id}}/revenue"
inputParameters:
- name: club_id
in: path
- name: period
in: query
operations:
- name: get-club-revenue
method: GET
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: franchise-agreements
path: "/customrecord_franchise_agreement"
inputParameters:
- name: club_id
in: query
operations:
- name: get-franchise-agreement
method: GET
- name: invoices
path: "/invoice"
operations:
- name: create-royalty-invoice
method: POST
Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Royalty Reconciliation Pipeline"
description: "Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- jira
- teams
- sendgrid
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-royalty-reconciliation-pipeline
description: "Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "teams.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "sendgrid.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Pulls the franchise sales pipeline from Salesforce, returning all active franchise opportunities with their stage, expected close date, and territory.
naftiko: "0.5"
info:
label: "Franchise Sales Pipeline Report"
description: "Pulls the franchise sales pipeline from Salesforce, returning all active franchise opportunities with their stage, expected close date, and territory."
tags:
- franchise
- sales
- salesforce
capability:
exposes:
- type: mcp
namespace: franchise-sales
port: 8080
tools:
- name: get-franchise-pipeline
description: "Retrieve all active franchise opportunities from Salesforce with stage, close date, and territory details."
inputParameters:
- name: stage_filter
in: body
type: string
description: "Optional stage to filter by (e.g., Negotiation, Proposal)."
call: "salesforce.query-opportunities"
with:
query: "SELECT Id, Name, StageName, CloseDate, Territory__c FROM Opportunity WHERE RecordType.Name = 'Franchise' AND IsClosed = false AND StageName LIKE '%{{stage_filter}}%'"
outputParameters:
- name: opportunities
type: string
mapping: "$.records"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: soql
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-opportunities
method: GET
Queries franchise territory demographics from the territory management system, returning population density, median income, competition proximity, and territory availability score.
naftiko: "0.5"
info:
label: "Franchise Territory Analysis"
description: "Queries franchise territory demographics from the territory management system, returning population density, median income, competition proximity, and territory availability score."
tags:
- franchise
- analytics
capability:
exposes:
- type: mcp
namespace: franchise-territory
port: 8080
tools:
- name: get-territory-analysis
description: "Retrieve demographic and competitive analysis for a franchise territory."
inputParameters:
- name: zip_code
in: body
type: string
description: "The center ZIP code for territory analysis."
- name: radius_miles
in: body
type: string
description: "Analysis radius in miles."
call: "territory-system.get-analysis"
with:
zip: "{{zip_code}}"
radius: "{{radius_miles}}"
outputParameters:
- name: population
type: string
mapping: "$.data.population"
- name: median_income
type: string
mapping: "$.data.medianIncome"
- name: competition_count
type: string
mapping: "$.data.competitorCount"
consumes:
- type: http
namespace: territory-system
baseUri: "https://api.planetfitness.com/internal/territory/v1"
authentication:
type: bearer
token: "$secrets.territory_token"
resources:
- name: analysis
path: "/territories/analyze"
operations:
- name: get-analysis
method: POST
Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Franchise Territory Map Lookup"
description: "Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems."
tags:
- franchise
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-territory-map-lookup
description: "Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.franchise-territory-map-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/franchise/territory/map/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: franchise-territory-map-lookup
method: GET
Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Franchise Training Compliance Tracker"
description: "Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- franchise
- planet-fitness
- jira
- teams
- sendgrid
capability:
exposes:
- type: mcp
namespace: franchise
port: 8080
tools:
- name: franchise-training-compliance-tracker
description: "Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "jira.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "teams.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "sendgrid.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/franchise"
operations:
- name: execute-1
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/franchise"
operations:
- name: execute-2
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/franchise"
operations:
- name: execute-3
method: POST
Pulls website traffic data for a specific club landing page from Google Analytics, returning page views, unique visitors, bounce rate, and conversion rate.
naftiko: "0.5"
info:
label: "Google Analytics Club Traffic Report"
description: "Pulls website traffic data for a specific club landing page from Google Analytics, returning page views, unique visitors, bounce rate, and conversion rate."
tags:
- marketing
- analytics
- google-analytics
capability:
exposes:
- type: mcp
namespace: web-analytics
port: 8080
tools:
- name: get-club-traffic
description: "Retrieve Google Analytics traffic metrics for a specific club landing page."
inputParameters:
- name: club_slug
in: body
type: string
description: "The URL slug for the club landing page."
- name: start_date
in: body
type: string
description: "Report start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "Report end date in YYYY-MM-DD format."
call: "google-analytics.get-report"
with:
page_path: "/clubs/{{club_slug}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
outputParameters:
- name: page_views
type: string
mapping: "$.rows[0].metricValues[0].value"
- name: unique_visitors
type: string
mapping: "$.rows[0].metricValues[1].value"
- name: bounce_rate
type: string
mapping: "$.rows[0].metricValues[2].value"
consumes:
- type: http
namespace: google-analytics
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/{{property_id}}:runReport"
inputParameters:
- name: property_id
in: path
operations:
- name: get-report
method: POST
Creates a guest pass entry in the Club OS CRM for a prospective member, including the guest name, referring member, and visit date.
naftiko: "0.5"
info:
label: "Guest Pass Issuance"
description: "Creates a guest pass entry in the Club OS CRM for a prospective member, including the guest name, referring member, and visit date."
tags:
- membership
- guest-pass
- club-os
capability:
exposes:
- type: mcp
namespace: membership
port: 8080
tools:
- name: issue-guest-pass
description: "Create a guest pass for a prospective member in Club OS."
inputParameters:
- name: guest_first_name
in: body
type: string
description: "Guest first name."
- name: guest_last_name
in: body
type: string
description: "Guest last name."
- name: guest_email
in: body
type: string
description: "Guest email address."
- name: referring_member_id
in: body
type: string
description: "The referring member's ID."
- name: club_id
in: body
type: string
description: "The club location identifier."
call: "club-os.create-guest"
with:
first_name: "{{guest_first_name}}"
last_name: "{{guest_last_name}}"
email: "{{guest_email}}"
referred_by: "{{referring_member_id}}"
location_id: "{{club_id}}"
outputParameters:
- name: guest_pass_id
type: string
mapping: "$.data.guest_id"
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: guests
path: "/guests"
operations:
- name: create-guest
method: POST
Records a HydroMassage session for a Black Card member in MINDBODY and verifies their Black Card status in Club OS before allowing the session.
naftiko: "0.5"
info:
label: "Hydromassage Usage Tracking"
description: "Records a HydroMassage session for a Black Card member in MINDBODY and verifies their Black Card status in Club OS before allowing the session."
tags:
- membership
- amenities
- mindbody
- club-os
capability:
exposes:
- type: mcp
namespace: amenities
port: 8080
tools:
- name: log-hydromassage-session
description: "Verify member tier and record a HydroMassage session."
inputParameters:
- name: member_id
in: body
type: string
description: "The member ID."
- name: club_id
in: body
type: string
description: "The club location identifier."
steps:
- name: verify-tier
type: call
call: "club-os.get-member"
with:
member_id: "{{member_id}}"
- name: log-session
type: call
call: "mindbody.add-client-visit"
with:
client_id: "{{member_id}}"
service_id: "hydromassage"
location_id: "{{club_id}}"
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: get-member
method: GET
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
resources:
- name: visits
path: "/client/addclientvisit"
operations:
- name: add-client-visit
method: POST
Submits a safety or incident report to the risk management system in ServiceNow, including the club location, date, incident type, and description.
naftiko: "0.5"
info:
label: "Incident Report Submission"
description: "Submits a safety or incident report to the risk management system in ServiceNow, including the club location, date, incident type, and description."
tags:
- operations
- safety
- servicenow
capability:
exposes:
- type: mcp
namespace: safety
port: 8080
tools:
- name: submit-incident-report
description: "File a safety incident report in ServiceNow for a club location."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: incident_type
in: body
type: string
description: "Type of incident (injury, property_damage, policy_violation)."
- name: description
in: body
type: string
description: "Detailed description of the incident."
- name: incident_date
in: body
type: string
description: "Date of incident in YYYY-MM-DD format."
call: "servicenow.create-incident"
with:
category: "safety_incident"
subcategory: "{{incident_type}}"
short_description: "Safety incident at club {{club_id}} on {{incident_date}}"
description: "{{description}}"
location: "{{club_id}}"
outputParameters:
- name: incident_number
type: string
mapping: "$.result.number"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.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 retail inventory levels in the POS system for a specific club, returning current stock counts for merchandise items and flagging items below reorder threshold.
naftiko: "0.5"
info:
label: "Inventory Reorder Alert"
description: "Checks retail inventory levels in the POS system for a specific club, returning current stock counts for merchandise items and flagging items below reorder threshold."
tags:
- retail
- inventory
- square
capability:
exposes:
- type: mcp
namespace: retail-inventory
port: 8080
tools:
- name: check-inventory-levels
description: "Check retail merchandise inventory levels for a club from Square."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
call: "square.get-inventory"
with:
location_id: "{{club_id}}"
outputParameters:
- name: items
type: string
mapping: "$.counts"
- name: low_stock_items
type: string
mapping: "$.lowStockItems"
consumes:
- type: http
namespace: square
baseUri: "https://connect.squareup.com/v2"
authentication:
type: bearer
token: "$secrets.square_access_token"
resources:
- name: inventory
path: "/inventory/counts/batch-retrieve"
operations:
- name: get-inventory
method: POST
Creates an IT support ticket in ServiceNow for club technology issues including POS terminals, Wi-Fi, and security cameras.
naftiko: "0.5"
info:
label: "IT Support Ticket Creation"
description: "Creates an IT support ticket in ServiceNow for club technology issues including POS terminals, Wi-Fi, and security cameras."
tags:
- it-support
- servicenow
capability:
exposes:
- type: mcp
namespace: it-support
port: 8080
tools:
- name: create-it-ticket
description: "Submit an IT support request to ServiceNow for a club technology issue."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: category
in: body
type: string
description: "IT category (pos, wifi, security_cameras, software)."
- name: description
in: body
type: string
description: "Description of the IT issue."
- name: priority
in: body
type: string
description: "Priority level (low, medium, high, critical)."
call: "servicenow.create-incident"
with:
category: "{{category}}"
short_description: "IT issue at club {{club_id}}: {{category}}"
description: "{{description}}"
priority: "{{priority}}"
location: "{{club_id}}"
outputParameters:
- name: ticket_number
type: string
mapping: "$.result.number"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.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
Updates a club's local business listing across Google Business Profile and Yelp when club hours or details change, and logs the update in Asana for the marketing team.
naftiko: "0.5"
info:
label: "Local SEO Listing Update Orchestrator"
description: "Updates a club's local business listing across Google Business Profile and Yelp when club hours or details change, and logs the update in Asana for the marketing team."
tags:
- marketing
- seo
- google-business
- yelp
- asana
capability:
exposes:
- type: mcp
namespace: local-seo
port: 8080
tools:
- name: update-local-listings
description: "Given updated club details, push changes to Google Business Profile and Yelp, then log in Asana."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: hours
in: body
type: string
description: "Updated hours in JSON format."
- name: phone
in: body
type: string
description: "Updated phone number."
steps:
- name: update-google
type: call
call: "google-business.update-location"
with:
location_id: "{{club_id}}"
hours: "{{hours}}"
phone: "{{phone}}"
- name: update-yelp
type: call
call: "yelp.update-business"
with:
business_id: "{{club_id}}"
hours: "{{hours}}"
phone: "{{phone}}"
- name: log-update
type: call
call: "asana.create-task"
with:
project: "local_seo"
name: "Listings updated for club {{club_id}}"
notes: "Google and Yelp listings updated. Hours: {{hours}}, Phone: {{phone}}."
consumes:
- type: http
namespace: google-business
baseUri: "https://mybusinessbusinessinformation.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_business_token"
resources:
- name: locations
path: "/locations/{{location_id}}"
inputParameters:
- name: location_id
in: path
operations:
- name: update-location
method: PATCH
- type: http
namespace: yelp
baseUri: "https://api.yelp.com/v3"
authentication:
type: bearer
token: "$secrets.yelp_api_key"
resources:
- name: businesses
path: "/businesses/{{business_id}}"
inputParameters:
- name: business_id
in: path
operations:
- name: update-business
method: PUT
- type: http
namespace: asana
baseUri: "https://app.asana.com/api/1.0"
authentication:
type: bearer
token: "$secrets.asana_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
method: POST
Pulls campaign performance from Google Ads and Facebook Ads, combines the metrics, and posts a summary report to a Slack channel for the marketing team to review.
naftiko: "0.5"
info:
label: "Marketing Campaign Performance Orchestrator"
description: "Pulls campaign performance from Google Ads and Facebook Ads, combines the metrics, and posts a summary report to a Slack channel for the marketing team to review."
tags:
- marketing
- google-ads
- facebook-ads
- slack
- analytics
capability:
exposes:
- type: mcp
namespace: marketing-analytics
port: 8080
tools:
- name: generate-campaign-report
description: "Given a campaign name and date range, pull Google Ads and Facebook Ads metrics, then post a consolidated summary to Slack."
inputParameters:
- name: campaign_name
in: body
type: string
description: "The campaign name to report on."
- name: start_date
in: body
type: string
description: "Report start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "Report end date in YYYY-MM-DD format."
steps:
- name: get-google-metrics
type: call
call: "google-ads.get-campaign-stats"
with:
campaign_name: "{{campaign_name}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: get-facebook-metrics
type: call
call: "facebook-ads.get-campaign-stats"
with:
campaign_name: "{{campaign_name}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: post-report
type: call
call: "slack.post-message"
with:
channel: "#marketing-reports"
text: "Campaign: {{campaign_name}} ({{start_date}} to {{end_date}})\nGoogle Ads — Impressions: {{get-google-metrics.impressions}}, Clicks: {{get-google-metrics.clicks}}, Spend: {{get-google-metrics.spend}}\nFacebook — Impressions: {{get-facebook-metrics.impressions}}, Clicks: {{get-facebook-metrics.clicks}}, Spend: {{get-facebook-metrics.spend}}"
consumes:
- type: http
namespace: google-ads
baseUri: "https://googleads.googleapis.com/v14"
authentication:
type: bearer
token: "$secrets.google_ads_token"
resources:
- name: campaigns
path: "/customers/{{customer_id}}/googleAds:searchStream"
inputParameters:
- name: customer_id
in: path
operations:
- name: get-campaign-stats
method: POST
- type: http
namespace: facebook-ads
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.facebook_ads_token"
resources:
- name: insights
path: "/act_{{ad_account_id}}/insights"
inputParameters:
- name: ad_account_id
in: path
operations:
- name: get-campaign-stats
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Member Agreement Details Lookup"
description: "Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems."
tags:
- member
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-agreement-details-lookup
description: "Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.member-agreement-details-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/member/agreement/details/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: member-agreement-details-lookup
method: GET
Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member App Engagement Analytics Pipeline"
description: "Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- salesforce
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-app-engagement-analytics-pipeline
description: "Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "salesforce.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Sends a targeted push notification to a member through the Planet Fitness mobile app notification service, supporting promotional offers, class reminders, and account alerts.
naftiko: "0.5"
info:
label: "Member App Push Notification"
description: "Sends a targeted push notification to a member through the Planet Fitness mobile app notification service, supporting promotional offers, class reminders, and account alerts."
tags:
- marketing
- mobile
- notifications
capability:
exposes:
- type: mcp
namespace: mobile-notifications
port: 8080
tools:
- name: send-push-notification
description: "Send a push notification to a member via the Planet Fitness mobile app."
inputParameters:
- name: member_id
in: body
type: string
description: "The member ID."
- name: title
in: body
type: string
description: "Notification title."
- name: message
in: body
type: string
description: "Notification body text."
- name: notification_type
in: body
type: string
description: "Type (promotion, class_reminder, account_alert)."
call: "push-service.send-notification"
with:
user_id: "{{member_id}}"
title: "{{title}}"
body: "{{message}}"
type: "{{notification_type}}"
outputParameters:
- name: delivery_status
type: string
mapping: "$.data.status"
consumes:
- type: http
namespace: push-service
baseUri: "https://api.planetfitness.com/internal/notifications/v1"
authentication:
type: bearer
token: "$secrets.push_service_token"
resources:
- name: notifications
path: "/push"
operations:
- name: send-notification
method: POST
Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Member Billing History Lookup"
description: "Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems."
tags:
- member
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-billing-history-lookup
description: "Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.member-billing-history-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/member/billing/history/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: member-billing-history-lookup
method: GET
Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Birthday Rewards Pipeline"
description: "Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- datadog
- planet-fitness
- servicenow
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-birthday-rewards-pipeline
description: "Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "datadog.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "planet-fitness.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "servicenow.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
When a member requests cancellation, updates their status in ABC Financial, removes them from active Mailchimp lists, logs a retention note in Club OS, and sends a survey via SurveyMonkey.
naftiko: "0.5"
info:
label: "Member Cancellation Processing Orchestrator"
description: "When a member requests cancellation, updates their status in ABC Financial, removes them from active Mailchimp lists, logs a retention note in Club OS, and sends a survey via SurveyMonkey."
tags:
- membership
- cancellation
- abc-financial
- mailchimp
- club-os
- surveymonkey
capability:
exposes:
- type: mcp
namespace: member-lifecycle
port: 8080
tools:
- name: process-cancellation
description: "Given a member ID, process their cancellation across billing, CRM, email, and trigger an exit survey."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID."
- name: cancellation_reason
in: body
type: string
description: "The reason provided for cancellation."
steps:
- name: cancel-billing
type: call
call: "abc-financial.cancel-membership"
with:
member_id: "{{member_id}}"
reason: "{{cancellation_reason}}"
- name: remove-from-list
type: call
call: "mailchimp.archive-subscriber"
with:
list_id: "active_members"
email: "{{cancel-billing.email}}"
- name: log-retention-note
type: call
call: "club-os.add-note"
with:
member_id: "{{member_id}}"
note: "Cancellation processed. Reason: {{cancellation_reason}}"
- name: send-survey
type: call
call: "surveymonkey.send-survey"
with:
survey_id: "exit_survey"
recipient_email: "{{cancel-billing.email}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: memberships
path: "/members/{{member_id}}/cancel"
inputParameters:
- name: member_id
in: path
operations:
- name: cancel-membership
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: subscribers
path: "/lists/{{list_id}}/members/{{email}}/actions/archive"
inputParameters:
- name: list_id
in: path
- name: email
in: path
operations:
- name: archive-subscriber
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: notes
path: "/members/{{member_id}}/notes"
inputParameters:
- name: member_id
in: path
operations:
- name: add-note
method: POST
- type: http
namespace: surveymonkey
baseUri: "https://api.surveymonkey.com/v3"
authentication:
type: bearer
token: "$secrets.surveymonkey_token"
resources:
- name: collectors
path: "/surveys/{{survey_id}}/collectors"
inputParameters:
- name: survey_id
in: path
operations:
- name: send-survey
method: POST
Retrieves a member profile from the Club OS CRM by member ID, returning membership tier, check-in history count, and home club location.
naftiko: "0.5"
info:
label: "Member Check-In Lookup"
description: "Retrieves a member profile from the Club OS CRM by member ID, returning membership tier, check-in history count, and home club location."
tags:
- membership
- crm
- club-os
capability:
exposes:
- type: mcp
namespace: membership
port: 8080
tools:
- name: get-member-profile
description: "Look up a Planet Fitness member by ID. Returns membership tier, home club, check-in count, and expiration date."
inputParameters:
- name: member_id
in: body
type: string
description: "The Club OS member identifier."
call: "club-os.get-member"
with:
member_id: "{{member_id}}"
outputParameters:
- name: membership_tier
type: string
mapping: "$.data.tier"
- name: home_club
type: string
mapping: "$.data.home_club_name"
- name: checkin_count
type: string
mapping: "$.data.total_checkins"
- name: expiration_date
type: string
mapping: "$.data.membership_expiration"
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: get-member
method: GET
Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Complaint Resolution Pipeline"
description: "Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- slack
- jira
- teams
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-complaint-resolution-pipeline
description: "Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "teams.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Data Privacy Request Pipeline"
description: "Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- slack
- jira
- teams
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-data-privacy-request-pipeline
description: "Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "slack.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "jira.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "teams.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Engagement Gamification Pipeline"
description: "Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- servicenow
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-engagement-gamification-pipeline
description: "Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "servicenow.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "salesforce.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Calculates a member engagement score by pulling check-in frequency from Club OS, class attendance from MINDBODY, app usage from Amplitude, and stores the composite score back in Club OS.
naftiko: "0.5"
info:
label: "Member Engagement Score Orchestrator"
description: "Calculates a member engagement score by pulling check-in frequency from Club OS, class attendance from MINDBODY, app usage from Amplitude, and stores the composite score back in Club OS."
tags:
- membership
- analytics
- club-os
- mindbody
- amplitude
capability:
exposes:
- type: mcp
namespace: member-analytics
port: 8080
tools:
- name: calculate-engagement-score
description: "Given a member ID, pull activity data from multiple sources and compute an engagement score."
inputParameters:
- name: member_id
in: body
type: string
description: "The member ID."
- name: period_days
in: body
type: string
description: "Number of days to look back for activity."
steps:
- name: get-checkins
type: call
call: "club-os.get-checkin-history"
with:
member_id: "{{member_id}}"
days: "{{period_days}}"
- name: get-class-attendance
type: call
call: "mindbody.get-client-visits"
with:
client_id: "{{member_id}}"
days: "{{period_days}}"
- name: get-app-usage
type: call
call: "amplitude.get-user-activity"
with:
user_id: "{{member_id}}"
days: "{{period_days}}"
- name: store-score
type: call
call: "club-os.update-engagement-score"
with:
member_id: "{{member_id}}"
checkin_count: "{{get-checkins.count}}"
class_count: "{{get-class-attendance.count}}"
app_sessions: "{{get-app-usage.session_count}}"
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: checkins
path: "/members/{{member_id}}/checkins"
inputParameters:
- name: member_id
in: path
- name: days
in: query
operations:
- name: get-checkin-history
method: GET
- name: engagement
path: "/members/{{member_id}}/engagement"
inputParameters:
- name: member_id
in: path
operations:
- name: update-engagement-score
method: PUT
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
resources:
- name: visits
path: "/client/clientvisits"
inputParameters:
- name: client_id
in: query
- name: days
in: query
operations:
- name: get-client-visits
method: GET
- type: http
namespace: amplitude
baseUri: "https://amplitude.com/api/2"
authentication:
type: basic
username: "$secrets.amplitude_api_key"
password: "$secrets.amplitude_secret_key"
resources:
- name: user-activity
path: "/useractivity"
inputParameters:
- name: user_id
in: query
- name: days
in: query
operations:
- name: get-user-activity
method: GET
Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Member Fitness Assessment Lookup"
description: "Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems."
tags:
- member
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-fitness-assessment-lookup
description: "Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.member-fitness-assessment-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/member/fitness/assessment/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: member-fitness-assessment-lookup
method: GET
Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Group Fitness Class Pipeline"
description: "Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- sendgrid
- workday
- datadog
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-group-fitness-class-pipeline
description: "Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "sendgrid.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "workday.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "datadog.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Payment Collection Pipeline"
description: "Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-payment-collection-pipeline
description: "Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Checks a member's payment status and last transaction in ABC Financial, returning payment method, last charge date, amount, and any past-due balance.
naftiko: "0.5"
info:
label: "Member Payment Status Lookup"
description: "Checks a member's payment status and last transaction in ABC Financial, returning payment method, last charge date, amount, and any past-due balance."
tags:
- billing
- membership
- abc-financial
capability:
exposes:
- type: mcp
namespace: billing
port: 8080
tools:
- name: get-payment-status
description: "Look up a member's billing status and most recent payment from ABC Financial."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID."
call: "abc-financial.get-payment-status"
with:
member_id: "{{member_id}}"
outputParameters:
- name: payment_method
type: string
mapping: "$.data.payment_method"
- name: last_charge_date
type: string
mapping: "$.data.last_charge_date"
- name: last_amount
type: string
mapping: "$.data.last_amount"
- name: past_due_balance
type: string
mapping: "$.data.past_due_balance"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: payments
path: "/members/{{member_id}}/payments"
inputParameters:
- name: member_id
in: path
operations:
- name: get-payment-status
method: GET
Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Member Photo Id Verification Status"
description: "Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems."
tags:
- member
- planet-fitness
- status
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-photo-id-verification-status
description: "Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.member-photo-id-verification-status"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/member/photo/id/verification/status/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: member-photo-id-verification-status
method: GET
When a member refers a new signup, validates the referral in ABC Financial, issues a reward credit, updates the referrer profile in Club OS, and sends a thank-you email via Mailchimp.
naftiko: "0.5"
info:
label: "Member Referral Reward Orchestrator"
description: "When a member refers a new signup, validates the referral in ABC Financial, issues a reward credit, updates the referrer profile in Club OS, and sends a thank-you email via Mailchimp."
tags:
- membership
- referral
- abc-financial
- club-os
- mailchimp
capability:
exposes:
- type: mcp
namespace: member-referrals
port: 8080
tools:
- name: process-referral-reward
description: "Given a referrer member ID and new member ID, validate the referral, issue reward credit, update CRM, and send thank-you email."
inputParameters:
- name: referrer_member_id
in: body
type: string
description: "The referring member's ABC Financial ID."
- name: new_member_id
in: body
type: string
description: "The newly signed up member's ABC Financial ID."
steps:
- name: validate-referral
type: call
call: "abc-financial.validate-referral"
with:
referrer_id: "{{referrer_member_id}}"
new_member_id: "{{new_member_id}}"
- name: issue-credit
type: call
call: "abc-financial.apply-credit"
with:
member_id: "{{referrer_member_id}}"
amount: "{{validate-referral.reward_amount}}"
reason: "Member referral reward"
- name: update-crm
type: call
call: "club-os.update-member"
with:
member_id: "{{referrer_member_id}}"
referral_count_increment: "1"
- name: send-thanks
type: call
call: "mailchimp.send-transactional"
with:
template: "referral_thank_you"
email: "{{validate-referral.referrer_email}}"
merge_vars_first_name: "{{validate-referral.referrer_first_name}}"
merge_vars_reward: "{{validate-referral.reward_amount}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: referrals
path: "/referrals/validate"
operations:
- name: validate-referral
method: POST
- name: credits
path: "/members/{{member_id}}/credits"
inputParameters:
- name: member_id
in: path
operations:
- name: apply-credit
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: update-member
method: PATCH
- type: http
namespace: mailchimp
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: bearer
token: "$secrets.mandrill_api_key"
resources:
- name: transactional
path: "/messages/send-template"
operations:
- name: send-transactional
method: POST
Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Referral Tracking Pipeline"
description: "Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- workday
- datadog
- planet-fitness
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-referral-tracking-pipeline
description: "Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "workday.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "planet-fitness.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Satisfaction Survey Pipeline"
description: "Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- teams
- sendgrid
- workday
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-satisfaction-survey-pipeline
description: "Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "teams.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "sendgrid.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "workday.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Member Usage Frequency Lookup"
description: "Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems."
tags:
- member
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-usage-frequency-lookup
description: "Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.member-usage-frequency-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/member/usage/frequency/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: member-usage-frequency-lookup
method: GET
Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Member Win Back Campaign Pipeline"
description: "Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- member
- planet-fitness
- planet-fitness
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: member
port: 8080
tools:
- name: member-win-back-campaign-pipeline
description: "Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "planet-fitness.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "servicenow.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "salesforce.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/member"
operations:
- name: execute-1
method: POST
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/member"
operations:
- name: execute-2
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/member"
operations:
- name: execute-3
method: POST
Submits a membership card reprint request for a member, looking up their details in Club OS and sending the print job to the card printing vendor API.
naftiko: "0.5"
info:
label: "Membership Card Reprint Request"
description: "Submits a membership card reprint request for a member, looking up their details in Club OS and sending the print job to the card printing vendor API."
tags:
- membership
- operations
- club-os
capability:
exposes:
- type: mcp
namespace: member-ops
port: 8080
tools:
- name: request-card-reprint
description: "Given a member ID and club ID, look up member details and send a card reprint request."
inputParameters:
- name: member_id
in: body
type: string
description: "The member ID."
- name: club_id
in: body
type: string
description: "The club where the card will be picked up."
steps:
- name: get-member
type: call
call: "club-os.get-member"
with:
member_id: "{{member_id}}"
- name: send-print-job
type: call
call: "card-printer.submit-job"
with:
member_name: "{{get-member.first_name}} {{get-member.last_name}}"
member_id: "{{member_id}}"
tier: "{{get-member.tier}}"
destination_club: "{{club_id}}"
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: get-member
method: GET
- type: http
namespace: card-printer
baseUri: "https://api.planetfitness.com/internal/cards/v1"
authentication:
type: bearer
token: "$secrets.card_printer_token"
resources:
- name: print-jobs
path: "/jobs"
operations:
- name: submit-job
method: POST
Processes a membership freeze by updating billing status in ABC Financial, pausing email campaigns in Mailchimp, adding a freeze note in Club OS, and sending a confirmation email to the member.
naftiko: "0.5"
info:
label: "Membership Freeze Request Orchestrator"
description: "Processes a membership freeze by updating billing status in ABC Financial, pausing email campaigns in Mailchimp, adding a freeze note in Club OS, and sending a confirmation email to the member."
tags:
- membership
- billing
- abc-financial
- mailchimp
- club-os
capability:
exposes:
- type: mcp
namespace: member-lifecycle
port: 8080
tools:
- name: process-membership-freeze
description: "Given a member ID and freeze duration, pause billing, update email lists, log in CRM, and send confirmation."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID."
- name: freeze_months
in: body
type: string
description: "Number of months to freeze the membership."
- name: reason
in: body
type: string
description: "Reason for the freeze request."
steps:
- name: freeze-billing
type: call
call: "abc-financial.freeze-membership"
with:
member_id: "{{member_id}}"
duration_months: "{{freeze_months}}"
- name: pause-emails
type: call
call: "mailchimp.update-subscriber"
with:
list_id: "active_members"
email: "{{freeze-billing.email}}"
status: "unsubscribed"
- name: log-freeze
type: call
call: "club-os.add-note"
with:
member_id: "{{member_id}}"
note: "Membership frozen for {{freeze_months}} months. Reason: {{reason}}"
- name: send-confirmation
type: call
call: "mailchimp.send-transactional"
with:
template: "freeze_confirmation"
email: "{{freeze-billing.email}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: freeze
path: "/members/{{member_id}}/freeze"
inputParameters:
- name: member_id
in: path
operations:
- name: freeze-membership
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: subscribers
path: "/lists/{{list_id}}/members/{{email}}"
inputParameters:
- name: list_id
in: path
- name: email
in: path
operations:
- name: update-subscriber
method: PATCH
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: notes
path: "/members/{{member_id}}/notes"
inputParameters:
- name: member_id
in: path
operations:
- name: add-note
method: POST
- type: http
namespace: mailchimp-transactional
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: bearer
token: "$secrets.mandrill_api_key"
resources:
- name: templates
path: "/messages/send-template"
operations:
- name: send-transactional
method: POST
Pulls membership revenue data from the billing platform ABC Financial for a given club and date range, returning total dues collected, new signups, and cancellation counts.
naftiko: "0.5"
info:
label: "Membership Revenue Report"
description: "Pulls membership revenue data from the billing platform ABC Financial for a given club and date range, returning total dues collected, new signups, and cancellation counts."
tags:
- billing
- finance
- abc-financial
- membership
capability:
exposes:
- type: mcp
namespace: billing
port: 8080
tools:
- name: get-revenue-report
description: "Retrieve membership billing revenue for a club and date range from ABC Financial."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: start_date
in: body
type: string
description: "Report start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "Report end date in YYYY-MM-DD format."
call: "abc-financial.get-revenue"
with:
club_id: "{{club_id}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
outputParameters:
- name: total_dues
type: string
mapping: "$.data.total_dues_collected"
- name: new_signups
type: string
mapping: "$.data.new_member_count"
- name: cancellations
type: string
mapping: "$.data.cancellation_count"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: revenue
path: "/clubs/{{club_id}}/revenue"
inputParameters:
- name: club_id
in: path
- name: start_date
in: query
- name: end_date
in: query
operations:
- name: get-revenue
method: GET
Upgrades a member from Classic to Black Card tier in ABC Financial, updates their CRM profile in Club OS, enables Black Card perks in MINDBODY, and sends a congratulatory email via Mailchimp.
naftiko: "0.5"
info:
label: "Membership Upgrade Orchestrator"
description: "Upgrades a member from Classic to Black Card tier in ABC Financial, updates their CRM profile in Club OS, enables Black Card perks in MINDBODY, and sends a congratulatory email via Mailchimp."
tags:
- membership
- upgrade
- abc-financial
- club-os
- mindbody
- mailchimp
capability:
exposes:
- type: mcp
namespace: member-lifecycle
port: 8080
tools:
- name: upgrade-membership
description: "Given a member ID, upgrade their plan from Classic to Black Card across all systems."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID."
steps:
- name: upgrade-billing
type: call
call: "abc-financial.upgrade-tier"
with:
member_id: "{{member_id}}"
new_tier: "black_card"
- name: update-crm
type: call
call: "club-os.update-member"
with:
member_id: "{{member_id}}"
tier: "Black Card"
- name: enable-perks
type: call
call: "mindbody.update-client-services"
with:
client_id: "{{member_id}}"
services: "black_card_perks"
- name: send-congrats
type: call
call: "mailchimp.send-transactional"
with:
template: "black_card_upgrade"
email: "{{upgrade-billing.email}}"
merge_vars_name: "{{upgrade-billing.first_name}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: tier-upgrades
path: "/members/{{member_id}}/upgrade"
inputParameters:
- name: member_id
in: path
operations:
- name: upgrade-tier
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: update-member
method: PATCH
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
resources:
- name: client-services
path: "/client/clientservices"
operations:
- name: update-client-services
method: POST
- type: http
namespace: mailchimp
baseUri: "https://mandrillapp.com/api/1.0"
authentication:
type: bearer
token: "$secrets.mandrill_api_key"
resources:
- name: transactional
path: "/messages/send-template"
operations:
- name: send-transactional
method: POST
Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "New Club Site Selection Analysis Pipeline"
description: "Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- new
- planet-fitness
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: new
port: 8080
tools:
- name: new-club-site-selection-analysis-pipeline
description: "Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/new"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/new"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/new"
operations:
- name: execute-3
method: POST
On new member signup in ABC Financial, creates a member record in Club OS, enrolls them in a welcome email campaign in Mailchimp, and books a free personal training session in MINDBODY.
naftiko: "0.5"
info:
label: "New Member Onboarding Orchestrator"
description: "On new member signup in ABC Financial, creates a member record in Club OS, enrolls them in a welcome email campaign in Mailchimp, and books a free personal training session in MINDBODY."
tags:
- membership
- onboarding
- abc-financial
- club-os
- mailchimp
- mindbody
capability:
exposes:
- type: mcp
namespace: member-onboarding
port: 8080
tools:
- name: onboard-new-member
description: "Given an ABC Financial member ID, create CRM record, enroll in welcome campaign, and book a free PT session."
inputParameters:
- name: member_id
in: body
type: string
description: "The ABC Financial member ID for the new signup."
- name: club_id
in: body
type: string
description: "The club location identifier."
steps:
- name: get-member-billing
type: call
call: "abc-financial.get-member"
with:
member_id: "{{member_id}}"
- name: create-crm-record
type: call
call: "club-os.create-member"
with:
first_name: "{{get-member-billing.first_name}}"
last_name: "{{get-member-billing.last_name}}"
email: "{{get-member-billing.email}}"
club_id: "{{club_id}}"
- name: add-to-campaign
type: call
call: "mailchimp.add-subscriber"
with:
list_id: "welcome_series"
email: "{{get-member-billing.email}}"
first_name: "{{get-member-billing.first_name}}"
- name: book-pt-session
type: call
call: "mindbody.book-appointment"
with:
client_id: "{{create-crm-record.client_id}}"
service_id: "free_pt_intro"
location_id: "{{club_id}}"
consumes:
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: members
path: "/members/{{member_id}}"
inputParameters:
- name: member_id
in: path
operations:
- name: get-member
method: GET
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: members
path: "/members"
operations:
- name: create-member
method: POST
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: subscribers
path: "/lists/{{list_id}}/members"
inputParameters:
- name: list_id
in: path
operations:
- name: add-subscriber
method: POST
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
inputParameters:
- name: Api-Key
in: header
value: "$secrets.mindbody_api_key"
resources:
- name: appointments
path: "/appointment/addappointment"
operations:
- name: book-appointment
method: POST
Distributes NPS surveys to members who visited a club in the last week by pulling recent check-ins from Club OS, filtering by visit frequency, sending surveys via SurveyMonkey, and logging the campaign in HubSpot.
naftiko: "0.5"
info:
label: "NPS Survey Distribution Orchestrator"
description: "Distributes NPS surveys to members who visited a club in the last week by pulling recent check-ins from Club OS, filtering by visit frequency, sending surveys via SurveyMonkey, and logging the campaign in HubSpot."
tags:
- customer-service
- nps
- club-os
- surveymonkey
- hubspot
capability:
exposes:
- type: mcp
namespace: nps-surveys
port: 8080
tools:
- name: distribute-nps-survey
description: "Given a club ID, pull recent visitors, send NPS survey, and log in HubSpot."
inputParameters:
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: week_ending
in: body
type: string
description: "The week ending date in YYYY-MM-DD format."
steps:
- name: get-recent-visitors
type: call
call: "club-os.get-recent-checkins"
with:
club_id: "{{club_id}}"
since: "{{week_ending}}"
- name: send-surveys
type: call
call: "surveymonkey.send-batch-survey"
with:
survey_id: "nps_weekly"
recipients: "{{get-recent-visitors.emails}}"
- name: log-campaign
type: call
call: "hubspot.create-activity"
with:
campaign_id: "nps_weekly_{{club_id}}"
note: "NPS surveys sent to {{get-recent-visitors.count}} members for club {{club_id}} week ending {{week_ending}}."
consumes:
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: checkins
path: "/locations/{{club_id}}/recent-checkins"
inputParameters:
- name: club_id
in: path
- name: since
in: query
operations:
- name: get-recent-checkins
method: GET
- type: http
namespace: surveymonkey
baseUri: "https://api.surveymonkey.com/v3"
authentication:
type: bearer
token: "$secrets.surveymonkey_token"
resources:
- name: batch
path: "/surveys/{{survey_id}}/collectors/batch"
inputParameters:
- name: survey_id
in: path
operations:
- name: send-batch-survey
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: activities
path: "/engagements/v1/engagements"
operations:
- name: create-activity
method: POST
Queries available personal training appointment slots from MINDBODY for a specified trainer and date, returning open time windows.
naftiko: "0.5"
info:
label: "Personal Trainer Availability Check"
description: "Queries available personal training appointment slots from MINDBODY for a specified trainer and date, returning open time windows."
tags:
- scheduling
- personal-training
- mindbody
capability:
exposes:
- type: mcp
namespace: pt-scheduling
port: 8080
tools:
- name: get-trainer-availability
description: "Retrieve available appointment slots for a specific personal trainer on a given date."
inputParameters:
- name: trainer_id
in: body
type: string
description: "The MINDBODY staff ID for the trainer."
- name: date
in: body
type: string
description: "Date to check availability in YYYY-MM-DD format."
call: "mindbody.get-availability"
with:
staff_id: "{{trainer_id}}"
date: "{{date}}"
outputParameters:
- name: available_slots
type: string
mapping: "$.AvailableTimes"
consumes:
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
inputParameters:
- name: Api-Key
in: header
value: "$secrets.mindbody_api_key"
resources:
- name: staff-availability
path: "/appointment/availabletimes"
inputParameters:
- name: staff_id
in: query
- name: date
in: query
operations:
- name: get-availability
method: GET
Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Personal Trainer Certification Tracker"
description: "Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- personal
- planet-fitness
- workday
- datadog
- planet-fitness
capability:
exposes:
- type: mcp
namespace: personal
port: 8080
tools:
- name: personal-trainer-certification-tracker
description: "Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "workday.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "datadog.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "planet-fitness.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/personal"
operations:
- name: execute-1
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: datadog-resource
path: "/api/personal"
operations:
- name: execute-2
method: POST
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: planet-fitness-resource
path: "/api/personal"
operations:
- name: execute-3
method: POST
Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems.
naftiko: "0.5"
info:
label: "Personal Training Session Lookup"
description: "Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems."
tags:
- personal
- planet-fitness
- lookup
capability:
exposes:
- type: mcp
namespace: personal
port: 8080
tools:
- name: personal-training-session-lookup
description: "Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems."
inputParameters:
- name: input_id
in: body
type: string
description: "The input id."
call: "planet-fitness.personal-training-session-lookup"
with:
input_id: "{{input_id}}"
outputParameters:
- name: result
type: string
mapping: "$.data"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: planet-fitness
baseUri: "https://api.planetfitness.com/v2"
authentication:
type: bearer
token: "$secrets.pf_api_token"
resources:
- name: resource
path: "/personal/training/session/lookup/{{input_id}}"
inputParameters:
- name: input_id
in: path
operations:
- name: personal-training-session-lookup
method: GET
Queries a point-of-sale transaction from the Square POS system by transaction ID, returning items sold, total amount, payment method, and timestamp.
naftiko: "0.5"
info:
label: "POS Transaction Lookup"
description: "Queries a point-of-sale transaction from the Square POS system by transaction ID, returning items sold, total amount, payment method, and timestamp."
tags:
- retail
- pos
- square
capability:
exposes:
- type: mcp
namespace: retail
port: 8080
tools:
- name: get-pos-transaction
description: "Look up a POS transaction from Square by transaction ID."
inputParameters:
- name: transaction_id
in: body
type: string
description: "The Square transaction identifier."
call: "square.get-payment"
with:
payment_id: "{{transaction_id}}"
outputParameters:
- name: total_amount
type: string
mapping: "$.payment.amount_money.amount"
- name: currency
type: string
mapping: "$.payment.amount_money.currency"
- name: status
type: string
mapping: "$.payment.status"
- name: created_at
type: string
mapping: "$.payment.created_at"
consumes:
- type: http
namespace: square
baseUri: "https://connect.squareup.com/v2"
authentication:
type: bearer
token: "$secrets.square_access_token"
resources:
- name: payments
path: "/payments/{{payment_id}}"
inputParameters:
- name: payment_id
in: path
operations:
- name: get-payment
method: GET
Validates a promotional code against the promotions engine, returning whether the code is active, the discount type, discount amount, and applicable membership tiers.
naftiko: "0.5"
info:
label: "Promo Code Validation"
description: "Validates a promotional code against the promotions engine, returning whether the code is active, the discount type, discount amount, and applicable membership tiers."
tags:
- marketing
- promotions
- membership
capability:
exposes:
- type: mcp
namespace: promotions
port: 8080
tools:
- name: validate-promo-code
description: "Check if a promotional code is valid and return its details."
inputParameters:
- name: promo_code
in: body
type: string
description: "The promotional code to validate."
call: "promo-engine.validate-code"
with:
code: "{{promo_code}}"
outputParameters:
- name: is_active
type: string
mapping: "$.data.active"
- name: discount_type
type: string
mapping: "$.data.discount_type"
- name: discount_amount
type: string
mapping: "$.data.discount_value"
- name: eligible_tiers
type: string
mapping: "$.data.eligible_tiers"
consumes:
- type: http
namespace: promo-engine
baseUri: "https://api.planetfitness.com/internal/promotions/v1"
authentication:
type: bearer
token: "$secrets.promo_engine_token"
resources:
- name: codes
path: "/codes/{{code}}/validate"
inputParameters:
- name: code
in: path
operations:
- name: validate-code
method: GET
Generates a quarterly franchise performance review by pulling financials from NetSuite, member metrics from ABC Financial, compliance scores from ServiceChannel, and compiles a report shared via Box.
naftiko: "0.5"
info:
label: "Quarterly Franchise Review Orchestrator"
description: "Generates a quarterly franchise performance review by pulling financials from NetSuite, member metrics from ABC Financial, compliance scores from ServiceChannel, and compiles a report shared via Box."
tags:
- franchise
- reporting
- netsuite
- abc-financial
- servicechannel
- box
capability:
exposes:
- type: mcp
namespace: franchise-reporting
port: 8080
tools:
- name: generate-quarterly-review
description: "Given a club ID and quarter, aggregate financials, member metrics, and compliance data, then upload the compiled report to Box."
inputParameters:
- name: club_id
in: body
type: string
description: "The franchise club identifier."
- name: quarter
in: body
type: string
description: "The quarter in format YYYY-Q# (e.g., 2026-Q1)."
steps:
- name: get-financials
type: call
call: "netsuite.get-quarterly-financials"
with:
club_id: "{{club_id}}"
period: "{{quarter}}"
- name: get-member-metrics
type: call
call: "abc-financial.get-quarterly-metrics"
with:
club_id: "{{club_id}}"
period: "{{quarter}}"
- name: get-compliance
type: call
call: "servicechannel.get-compliance-summary"
with:
location_id: "{{club_id}}"
period: "{{quarter}}"
- name: upload-report
type: call
call: "box.upload-file"
with:
folder_id: "franchise_reviews"
file_name: "QBR_{{club_id}}_{{quarter}}.pdf"
content: "Revenue: ${{get-financials.total_revenue}}, Members: {{get-member-metrics.total_active}}, Compliance Score: {{get-compliance.score}}"
consumes:
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: financials
path: "/customrecord_quarterly_financials"
inputParameters:
- name: club_id
in: query
- name: period
in: query
operations:
- name: get-quarterly-financials
method: GET
- type: http
namespace: abc-financial
baseUri: "https://api.abcfinancial.com/v2"
authentication:
type: bearer
token: "$secrets.abc_financial_token"
resources:
- name: quarterly-metrics
path: "/clubs/{{club_id}}/metrics"
inputParameters:
- name: club_id
in: path
- name: period
in: query
operations:
- name: get-quarterly-metrics
method: GET
- type: http
namespace: servicechannel
baseUri: "https://api.servicechannel.com/v3"
authentication:
type: bearer
token: "$secrets.servicechannel_token"
resources:
- name: compliance
path: "/locations/{{location_id}}/compliance"
inputParameters:
- name: location_id
in: path
- name: period
in: query
operations:
- name: get-compliance-summary
method: GET
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Seasonal Membership Promotion Pipeline"
description: "Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- seasonal
- planet-fitness
- teams
- sendgrid
- workday
capability:
exposes:
- type: mcp
namespace: seasonal
port: 8080
tools:
- name: seasonal-membership-promotion-pipeline
description: "Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "teams.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "sendgrid.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "workday.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.teams_token"
resources:
- name: teams-resource
path: "/api/seasonal"
operations:
- name: execute-1
method: POST
- type: http
namespace: sendgrid
baseUri: "https://api.sendgrid.com/v3"
authentication:
type: bearer
token: "$secrets.sendgrid_api_key"
resources:
- name: sendgrid-resource
path: "/api/seasonal"
operations:
- name: execute-2
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl.workday.com/pf/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workday-resource
path: "/api/seasonal"
operations:
- name: execute-3
method: POST
Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Social Media Brand Monitoring Pipeline"
description: "Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- social
- planet-fitness
- servicenow
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: social
port: 8080
tools:
- name: social-media-brand-monitoring-pipeline
description: "Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "servicenow.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "salesforce.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "snowflake.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://planetfitness.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: servicenow-resource
path: "/api/social"
operations:
- name: execute-1
method: POST
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/social"
operations:
- name: execute-2
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/social"
operations:
- name: execute-3
method: POST
Creates a social media post across Instagram and Facebook via the Meta Business API, then logs the post details in HubSpot for campaign tracking and notifies the marketing team in Slack.
naftiko: "0.5"
info:
label: "Social Media Post Scheduler Orchestrator"
description: "Creates a social media post across Instagram and Facebook via the Meta Business API, then logs the post details in HubSpot for campaign tracking and notifies the marketing team in Slack."
tags:
- marketing
- social-media
- meta
- hubspot
- slack
capability:
exposes:
- type: mcp
namespace: social-media
port: 8080
tools:
- name: schedule-social-post
description: "Given post content and an image URL, publish to Instagram and Facebook, log in HubSpot, and notify marketing Slack channel."
inputParameters:
- name: caption
in: body
type: string
description: "The post caption text."
- name: image_url
in: body
type: string
description: "URL of the image to publish."
- name: campaign_id
in: body
type: string
description: "The HubSpot campaign ID for tracking."
steps:
- name: post-instagram
type: call
call: "meta.publish-ig-post"
with:
caption: "{{caption}}"
image_url: "{{image_url}}"
- name: post-facebook
type: call
call: "meta.publish-fb-post"
with:
message: "{{caption}}"
link: "{{image_url}}"
- name: log-campaign
type: call
call: "hubspot.create-activity"
with:
campaign_id: "{{campaign_id}}"
note: "Social post published. IG ID: {{post-instagram.id}}, FB ID: {{post-facebook.id}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "#social-media"
text: "New post live on IG and FB. Campaign: {{campaign_id}}"
consumes:
- type: http
namespace: meta
baseUri: "https://graph.facebook.com/v18.0"
authentication:
type: bearer
token: "$secrets.meta_page_token"
resources:
- name: instagram-media
path: "/{{ig_user_id}}/media"
inputParameters:
- name: ig_user_id
in: path
operations:
- name: publish-ig-post
method: POST
- name: facebook-posts
path: "/{{page_id}}/feed"
inputParameters:
- name: page_id
in: path
operations:
- name: publish-fb-post
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: activities
path: "/engagements/v1/engagements"
operations:
- name: create-activity
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
Records a tanning booth session for a Black Card member in MINDBODY and updates their session count in Club OS.
naftiko: "0.5"
info:
label: "Tanning Booth Usage Tracker"
description: "Records a tanning booth session for a Black Card member in MINDBODY and updates their session count in Club OS."
tags:
- membership
- tanning
- mindbody
- club-os
capability:
exposes:
- type: mcp
namespace: amenities
port: 8080
tools:
- name: log-tanning-session
description: "Record a tanning booth session for a member and update their usage count."
inputParameters:
- name: member_id
in: body
type: string
description: "The member ID."
- name: club_id
in: body
type: string
description: "The club location identifier."
- name: booth_id
in: body
type: string
description: "The specific tanning booth identifier."
steps:
- name: log-session
type: call
call: "mindbody.add-client-visit"
with:
client_id: "{{member_id}}"
service_id: "tanning"
location_id: "{{club_id}}"
resource_id: "{{booth_id}}"
- name: update-count
type: call
call: "club-os.increment-usage"
with:
member_id: "{{member_id}}"
amenity: "tanning"
consumes:
- type: http
namespace: mindbody
baseUri: "https://api.mindbodyonline.com/public/v6"
authentication:
type: bearer
token: "$secrets.mindbody_token"
inputParameters:
- name: Api-Key
in: header
value: "$secrets.mindbody_api_key"
resources:
- name: visits
path: "/client/addclientvisit"
operations:
- name: add-client-visit
method: POST
- type: http
namespace: club-os
baseUri: "https://api.clubos.com/v2"
authentication:
type: bearer
token: "$secrets.clubos_token"
resources:
- name: usage
path: "/members/{{member_id}}/usage"
inputParameters:
- name: member_id
in: path
operations:
- name: increment-usage
method: POST
Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Vendor Contract Renewal Pipeline"
description: "Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- vendor
- planet-fitness
- salesforce
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: vendor
port: 8080
tools:
- name: vendor-contract-renewal-pipeline
description: "Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "salesforce.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "snowflake.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "slack.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_access_token"
resources:
- name: salesforce-resource
path: "/api/vendor"
operations:
- name: execute-1
method: POST
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/vendor"
operations:
- name: execute-2
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/vendor"
operations:
- name: execute-3
method: POST
When a vendor invoice arrives via email, extracts invoice data, creates a payable in NetSuite, matches it against the purchase order, and notifies the AP team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Vendor Invoice Processing Orchestrator"
description: "When a vendor invoice arrives via email, extracts invoice data, creates a payable in NetSuite, matches it against the purchase order, and notifies the AP team in Microsoft Teams."
tags:
- finance
- accounts-payable
- netsuite
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ap-processing
port: 8080
tools:
- name: process-vendor-invoice
description: "Given invoice details, create a payable in NetSuite, match to PO, and notify the AP team."
inputParameters:
- name: vendor_name
in: body
type: string
description: "Name of the vendor."
- name: invoice_number
in: body
type: string
description: "The vendor invoice number."
- name: amount
in: body
type: string
description: "Invoice amount."
- name: po_number
in: body
type: string
description: "Related purchase order number."
steps:
- name: create-payable
type: call
call: "netsuite.create-vendor-bill"
with:
vendor: "{{vendor_name}}"
invoice_number: "{{invoice_number}}"
amount: "{{amount}}"
po_reference: "{{po_number}}"
- name: match-po
type: call
call: "netsuite.match-po"
with:
bill_id: "{{create-payable.bill_id}}"
po_number: "{{po_number}}"
- name: notify-ap
type: call
call: "msteams.send-message"
with:
channel_id: "ap-team"
text: "Invoice {{invoice_number}} from {{vendor_name}} (${{amount}}) created. PO match: {{match-po.match_status}}."
consumes:
- type: http
namespace: netsuite
baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
authentication:
type: bearer
token: "$secrets.netsuite_token"
resources:
- name: vendor-bills
path: "/vendorBill"
operations:
- name: create-vendor-bill
method: POST
- name: po-matching
path: "/vendorBill/{{bill_id}}/match"
inputParameters:
- name: bill_id
in: path
operations:
- name: match-po
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.
naftiko: "0.5"
info:
label: "Vendor Payment Processing Pipeline"
description: "Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
tags:
- vendor
- planet-fitness
- snowflake
- slack
- jira
capability:
exposes:
- type: mcp
namespace: vendor
port: 8080
tools:
- name: vendor-payment-processing-pipeline
description: "Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
inputParameters:
- name: input_id
in: body
type: string
description: "The primary input identifier."
steps:
- name: step-1
type: call
call: "snowflake.execute-1"
with:
input: "{{input_id}}"
- name: step-2
type: call
call: "slack.execute-2"
with:
input: "{{input_id}}"
- name: step-3
type: call
call: "jira.execute-3"
with:
input: "{{input_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: snowflake-resource
path: "/api/vendor"
operations:
- name: execute-1
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: slack-resource
path: "/api/vendor"
operations:
- name: execute-2
method: POST
- type: http
namespace: jira
baseUri: "https://planetfitness.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: jira-resource
path: "/api/vendor"
operations:
- name: execute-3
method: POST