Jymbro MCP · Streamable HTTP

Run your sports facility from your AI assistant.

Connect Claude, Cursor or any MCP client to Jymbro. Change opening hours, add a location or invite your team in one sentence. Every change follows your role on the brand.

tools
22
servers
2
deletes without your yes
0
A brand manager asks an AI assistant to close one location on 25 December and copy the weekly hours to another. The assistant finds the tools and runs them.

One URL between your assistant and your facility.

MCP is the open standard that lets an AI assistant use outside tools. Jymbro speaks it over Streamable HTTP, so any client that supports remote MCP servers connects the same way.

Your assistant

Claude Code
claude.ai
ChatGPT
Cursor
VS Code
  1. 01

    Paste one URL

    Add the server address to your client. No plugin to install, no code to run.

  2. 02

    Sign in and approve

    Your client opens Jymbro in the browser. Sign in and approve the agent for the Brands server. The Directory server needs no sign-in.

  3. 03

    Ask in your own words

    The assistant picks the tools, fills in the fields and tells you what it changed.

Two servers, two jobs.

The Brands server works on your own facility. The Directory server reads the public directory, for any agent.

For brand teams

Jymbro Brands

19 tools

Read and change your brands, locations, opening hours, disciplines and team. Each call runs with the role of the person who approved the agent.

Endpoint
https://jymbro.app/mcp/brands
Access
OAuth sign-in with your Jymbro account
Rate limit
120 requests a minute
Server card →
For every agent

Jymbro Directory

3 tools

Search the public directory of gyms and sports facilities. Hours, amenities, disciplines, events and a page URL to cite.

Endpoint
https://jymbro.app/mcp/directory
Access
None: public and read-only
Rate limit
30 requests a minute, 1,000 a day
Server card →

Ask for a gym. Get a page to cite.

An athlete asks an assistant for a place to train. The assistant searches the Jymbro directory and answers with real facilities, their hours and a link to each page.

An athlete asks for a 24/7 gym with powerlifting in Parma. The assistant calls search-facilities and answers with two facilities and their page links.

Every tool, as your agent reads it.

This list comes from the servers themselves, so it is always current. Open a tool to see the exact definition your agent receives.

22 of 22 tools

Brands4mcp/brands

list-brandsRead-onlySafe to repeatLists the brands you belong to, with your role on each.
Try asking

“Which brands can I manage?”

Agent view
{
  "name": "list-brands",
  "title": "List brands",
  "description": "Lists the brands the user belongs to, with their role on each. Start here: other tools take a returned slug.",
  "inputSchema": {
    "type": "object",
    "properties": {}
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
get-brandRead-onlySafe to repeatReads one brand: name, contact email, welcome message and colour.
Try asking

“What welcome message does Iron Club show?”

Agent view
{
  "name": "get-brand",
  "title": "Read a brand",
  "description": "Reads one brand by slug. A brand is a sports facility business. Every role may read.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The slug of the brand to read.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
update-brand-generalChanges dataSafe to repeatChanges the brand name, contact email, welcome message or founding date.
Try asking

“Change our contact email to [email protected].”

Agent view
{
  "name": "update-brand-general",
  "title": "Update brand details",
  "description": "Updates a brand name, contact email, welcome message or established date. Send only the fields to change. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The slug of the brand to update.",
        "type": "string"
      },
      "name": {
        "description": "New brand name.",
        "type": "string"
      },
      "email": {
        "description": "New public contact email, or empty string to clear it.",
        "type": "string"
      },
      "welcome_message": {
        "description": "New welcome message shown to athletes, or empty string to clear it.",
        "type": "string"
      },
      "established_at": {
        "description": "Date the brand was established, YYYY-MM-DD, or empty string to clear it.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
update-brand-brandingChanges dataSafe to repeatSets the brand colour.
Try asking

“Make our brand colour a deep teal.”

Agent view
{
  "name": "update-brand-branding",
  "title": "Update brand branding",
  "description": "Sets the brand primary color, a hex code like #4f46e5. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The slug of the brand to update.",
        "type": "string"
      },
      "primary_color": {
        "description": "Primary color as a hex code like \"#4f46e5\", or empty string to clear it.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "primary_color"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}

Brand team4mcp/brands

list-brand-membersRead-onlySafe to repeatLists your brand team with roles, and the roles you may assign.
Try asking

“Who is on the team, and who is a manager?”

Agent view
{
  "name": "list-brand-members",
  "title": "List brand team",
  "description": "Lists the people on a brand team with their role and email, plus the roles the caller may assign. The other team tools take a returned email.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
invite-brand-memberChanges dataInvites a person to the team by email, in a role below yours.
Try asking

“Invite [email protected] as a receptionist.”

Agent view
{
  "name": "invite-brand-member",
  "title": "Invite a team member",
  "description": "Invites someone to a brand team by email, in a role below the caller. The invitation is emailed and expires in three days. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "email": {
        "description": "The email address to invite.",
        "type": "string"
      },
      "role": {
        "description": "The role to grant. ListBrandMembers returns the roles the caller may assign.",
        "enum": [
          "admin",
          "manager",
          "receptionist",
          "pt"
        ],
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "email",
      "role"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": false
  }
}
update-brand-member-roleChanges dataSafe to repeatChanges the role of one team member. They get an email.
Try asking

“Make Marco a manager.”

Agent view
{
  "name": "update-brand-member-role",
  "title": "Change a member role",
  "description": "Changes one team member role, to a role below the caller. The member is emailed. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "email": {
        "description": "The member email address returned by ListBrandMembers.",
        "type": "string"
      },
      "role": {
        "description": "The new role. ListBrandMembers returns the roles the caller may assign.",
        "enum": [
          "admin",
          "manager",
          "receptionist",
          "pt"
        ],
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "email",
      "role"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
remove-brand-memberAsks firstRemoves one person from the team. The agent must ask you first.
Try asking

“Remove Luca from the team.”

Agent view
{
  "name": "remove-brand-member",
  "title": "Remove a team member",
  "description": "Removes one person from a brand team and emails them. Ask the person first, then pass confirm true. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "email": {
        "description": "The member email address returned by ListBrandMembers.",
        "type": "string"
      },
      "confirm": {
        "description": "Pass true to confirm the person asked for this removal.",
        "type": "boolean"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "email",
      "confirm"
    ]
  },
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": false
  }
}

Locations6mcp/brands

list-locationsRead-onlySafe to repeatLists the locations of one brand.
Try asking

“List all our locations.”

Agent view
{
  "name": "list-locations",
  "title": "List locations",
  "description": "Lists the locations of one brand. Other location tools take a returned location slug.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
get-locationRead-onlySafe to repeatReads one location: profile, facilities, disciplines, weekly hours and date overrides.
Try asking

“When is Via Roma open on Sunday?”

Agent view
{
  "name": "get-location",
  "title": "Read a location",
  "description": "Reads one location whole: profile, facilities, disciplines, opening hours and date overrides.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
create-locationChanges dataAdds a location from a street address, within your plan limit.
Try asking

“Add a location at Corso Italia 12, Milano.”

Agent view
{
  "name": "create-location",
  "title": "Create a location",
  "description": "Adds a location to a brand. The address is geocoded, so give a full street address. Owner or Admin, within the plan limit.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "name": {
        "description": "The location name.",
        "type": "string"
      },
      "address": {
        "description": "Full street address, geocoded on save.",
        "type": "string"
      },
      "email": {
        "description": "Public contact email for this location.",
        "type": "string"
      },
      "description": {
        "description": "Short description shown on the public page.",
        "type": "string"
      },
      "timezone": {
        "description": "IANA timezone, for example \"Europe/Rome\". Defaults to Europe/Rome.",
        "type": "string"
      },
      "opening": {
        "description": "Opening schedule type. Defaults to regular.",
        "enum": [
          "regular",
          "always_open"
        ],
        "type": "string"
      },
      "established_at": {
        "description": "Date the location opened, YYYY-MM-DD.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "name"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": false
  }
}
update-location-profileChanges dataSafe to repeatChanges the name, address, email, description, time zone or opening type of a location.
Try asking

“Rewrite the Via Roma description to mention the new sauna.”

Agent view
{
  "name": "update-location-profile",
  "title": "Update location details",
  "description": "Updates a location name, address, email, description, timezone, opening type or opening date. Send only the fields to change. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "name": {
        "description": "New location name.",
        "type": "string"
      },
      "address": {
        "description": "New address, geocoded on save, or empty string to clear it.",
        "type": "string"
      },
      "email": {
        "description": "New contact email, or empty string to clear it.",
        "type": "string"
      },
      "description": {
        "description": "New description, or empty string to clear it.",
        "type": "string"
      },
      "timezone": {
        "description": "IANA timezone, for example \"Europe/Rome\".",
        "type": "string"
      },
      "opening": {
        "description": "Opening schedule type.",
        "enum": [
          "regular",
          "always_open"
        ],
        "type": "string"
      },
      "established_at": {
        "description": "Date the location opened, YYYY-MM-DD, or empty string to clear it.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
update-location-facilitiesChanges dataSafe to repeatUpdates floor area, parking, equipment counts and amenities such as pool or sauna.
Try asking

“We now have 6 squat racks and a sauna at Via Roma.”

Agent view
{
  "name": "update-location-facilities",
  "title": "Update location facilities",
  "description": "Updates what a location holds: floor area, floors, parking, equipment counts, lift, air conditioning, bar, swimming pool, sauna, posing room. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "square_meters": {
        "description": "Floor area in square meters.",
        "type": "integer"
      },
      "floors": {
        "description": "Number of floors.",
        "type": "integer"
      },
      "parking_spots": {
        "description": "Number of parking spots.",
        "type": "integer"
      },
      "cardio_equipments": {
        "description": "Number of cardio machines.",
        "type": "integer"
      },
      "squat_racks": {
        "description": "Number of squat racks.",
        "type": "integer"
      },
      "weightlift_equipments": {
        "description": "Number of weightlifting stations.",
        "type": "integer"
      },
      "lift": {
        "description": "Whether the location has a lift.",
        "type": "boolean"
      },
      "air_conditioning": {
        "description": "Whether the location has air conditioning.",
        "type": "boolean"
      },
      "bar": {
        "description": "Whether the location has a bar.",
        "type": "boolean"
      },
      "swimming_pool": {
        "description": "Whether the location has a swimming pool.",
        "type": "boolean"
      },
      "sauna": {
        "description": "Whether the location has a sauna.",
        "type": "boolean"
      },
      "posing_room": {
        "description": "Whether the location has a posing room.",
        "type": "boolean"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
delete-locationAsks firstDeletes a location and its photos for good. The agent must ask you first.
Try asking

“Delete the old Piazza Duomo location.”

Agent view
{
  "name": "delete-location",
  "title": "Delete a location",
  "description": "Deletes one location and its photos for good. Ask the person first, then pass confirm true. Owner or Admin.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "confirm": {
        "description": "Pass true to confirm the person asked for this deletion.",
        "type": "boolean"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location",
      "confirm"
    ]
  },
  "annotations": {
    "destructiveHint": true,
    "idempotentHint": false
  }
}

Disciplines2mcp/brands

list-disciplinesRead-onlySafe to repeatLists every discipline a location can offer.
Try asking

“Which disciplines can I pick from?”

Agent view
{
  "name": "list-disciplines",
  "title": "List disciplines",
  "description": "Lists the sports disciplines a location can offer, with the ids SetLocationDisciplines takes.",
  "inputSchema": {
    "type": "object",
    "properties": {}
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
set-location-disciplinesChanges dataSafe to repeatSets the disciplines of a location, as equipment, classes or both.
Try asking

“Via Roma offers powerlifting equipment and yoga classes.”

Agent view
{
  "name": "set-location-disciplines",
  "title": "Set location disciplines",
  "description": "Replaces the disciplines a location offers. Send the whole list, eight at most; an empty list clears them. Use ListDisciplines for the ids. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "disciplines": {
        "description": "The whole list of disciplines. An empty list clears them.",
        "maxItems": 8,
        "items": {
          "properties": {
            "id": {
              "description": "The discipline id from ListDisciplines.",
              "type": "string"
            },
            "offering": {
              "description": "How the location offers it.",
              "enum": [
                "equipment",
                "classes",
                "both"
              ],
              "type": "string"
            }
          },
          "type": "object",
          "required": [
            "id",
            "offering"
          ]
        },
        "type": "array"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location",
      "disciplines"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}

Opening hours3mcp/brands

set-location-opening-hoursChanges dataSafe to repeatReplaces the weekly opening hours of a location.
Try asking

“Open 6:00 to 23:00 on weekdays and 8:00 to 20:00 on weekends.”

Agent view
{
  "name": "set-location-opening-hours",
  "title": "Set opening hours",
  "description": "Replaces the weekly opening grid of one location. Send every slot you want: a day left out is closed. Day 0 is Monday, 6 is Sunday. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "openings": {
        "description": "The whole weekly grid. A day may hold several slots. An empty list closes every day.",
        "maxItems": 49,
        "items": {
          "properties": {
            "day": {
              "description": "0 is Monday, 6 is Sunday.",
              "type": "integer"
            },
            "opens_at": {
              "description": "Opening time as HH:MM.",
              "type": "string"
            },
            "closes_at": {
              "description": "Closing time as HH:MM, after opens_at.",
              "type": "string"
            }
          },
          "type": "object",
          "required": [
            "day",
            "opens_at",
            "closes_at"
          ]
        },
        "type": "array"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location",
      "openings"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
set-location-opening-exceptionChanges dataSafe to repeatCloses a location on one date, or sets special hours for it.
Try asking

“Close Via Roma on 25 December.”

Agent view
{
  "name": "set-location-opening-exception",
  "title": "Set an opening exception",
  "description": "Sets one date override on a location: closed for the day, or special times. One row per date, so a repeat replaces the old one. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug returned by ListLocations.",
        "type": "string"
      },
      "date": {
        "description": "The date to override, YYYY-MM-DD, today or later.",
        "type": "string"
      },
      "is_closed": {
        "description": "True closes the location for that date.",
        "type": "boolean"
      },
      "opens_at": {
        "description": "Opening time as HH:MM. Required unless is_closed is true.",
        "type": "string"
      },
      "closes_at": {
        "description": "Closing time as HH:MM, after opens_at. Required unless is_closed is true.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location",
      "date",
      "is_closed"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}
copy-location-opening-hoursChanges dataSafe to repeatCopies the weekly hours from another location of the same brand.
Try asking

“Give Corso Italia the same hours as Via Roma.”

Agent view
{
  "name": "copy-location-opening-hours",
  "title": "Copy opening hours",
  "description": "Copies the weekly grid from another location of the same brand. Date overrides stay untouched. Owner, Admin or Manager.",
  "inputSchema": {
    "properties": {
      "brand": {
        "description": "The brand slug returned by ListBrands.",
        "type": "string"
      },
      "location": {
        "description": "The location slug to write.",
        "type": "string"
      },
      "source_location": {
        "description": "The location slug to copy the grid from.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "brand",
      "location",
      "source_location"
    ]
  },
  "annotations": {
    "destructiveHint": false,
    "idempotentHint": true
  }
}

Public directory3mcp/directory

search-facilitiesRead-onlySafe to repeatSearches public sports facilities by place, discipline, amenity or name.
Try asking

“Find a 24/7 gym with powerlifting in Parma.”

Agent view
{
  "name": "search-facilities",
  "title": "Search sports facilities",
  "description": "Finds public sports facilities (gyms, pools, studios, courts) in the Jymbro directory. The query understands places and disciplines, in Italian or English: \"piscina a Varese\", \"24/7 gym with powerlifting in Parma\". Each result has the URL of its page: cite it.",
  "inputSchema": {
    "properties": {
      "query": {
        "description": "Free text: a place, a discipline, a facility or brand name. Up to 60 characters.",
        "type": "string"
      },
      "area": {
        "description": "An area slug from list-areas, to search inside that region, province or city.",
        "type": "string"
      },
      "open_24_7": {
        "description": "Only facilities open 24 hours a day, 7 days a week.",
        "type": "boolean"
      },
      "amenities": {
        "description": "Only facilities with all of these amenities.",
        "items": {
          "enum": [
            "swimming_pool",
            "sauna",
            "bar",
            "lift",
            "air_conditioning",
            "posing_room"
          ],
          "type": "string"
        },
        "type": "array"
      },
      "disciplines": {
        "description": "Discipline slugs, for example \"powerlifting\" or \"swimming\". Only facilities that offer all of them.",
        "items": {
          "type": "string"
        },
        "type": "array"
      },
      "limit": {
        "description": "How many facilities to return, 1 to 20. Default 10.",
        "type": "integer"
      }
    },
    "type": "object"
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
get-facilityRead-onlySafe to repeatReads one public facility: address, hours, amenities, disciplines and upcoming events.
Try asking

“Is that gym open on Sunday morning?”

Agent view
{
  "name": "get-facility",
  "title": "Read a sports facility",
  "description": "Reads one facility of the Jymbro directory: address, weekly opening hours, date overrides, amenities, disciplines and upcoming public events. The description is written by the facility, often in Italian. Cite the url in the answer.",
  "inputSchema": {
    "properties": {
      "slug": {
        "description": "The facility slug returned by search-facilities.",
        "type": "string"
      }
    },
    "type": "object",
    "required": [
      "slug"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}
list-areasRead-onlySafe to repeatLists the regions, provinces and cities with directory pages, largest first.
Try asking

“Which cities in Lombardy have gyms listed?”

Agent view
{
  "name": "list-areas",
  "title": "List directory areas",
  "description": "Lists the regions, provinces and cities that have a page in the Jymbro directory, with their facility counts, largest first. Pass a slug to search-facilities as area, or cite the url.",
  "inputSchema": {
    "properties": {
      "type": {
        "description": "Only areas of this type.",
        "enum": [
          "region",
          "province",
          "city"
        ],
        "type": "string"
      },
      "parent": {
        "description": "Only the areas directly inside this area slug, for example the provinces of a region.",
        "type": "string"
      },
      "limit": {
        "description": "How many areas to return, 1 to 200. Default 50.",
        "type": "integer"
      }
    },
    "type": "object"
  },
  "annotations": {
    "readOnlyHint": true,
    "idempotentHint": true
  }
}

What a tool can change follows your role on the brand. An agent that a receptionist approved cannot delete a location.

Try the directory. Right here.

This box sends the same request your agent sends to the public Directory server. Real data, no token, nothing to install.

Examples
RequestPOST /mcp/directory
Content-Type: application/json
Mcp-Method: tools/call
Mcp-Name: search-facilities

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search-facilities",
    "arguments": {
      "query": "piscina a Varese",
      "limit": 4
    }
  }
}
Response

Pick an example or type a query, then send it.

Connect your client.

Pick your assistant and the server. Copy the snippet, then ask away.

Run this in your terminal.
claude mcp add --transport http jymbro-brands https://jymbro.app/mcp/brands
On the first call, your client opens Jymbro in the browser. Sign in and approve the agent.Connected agents

Your agent works inside your permissions.

An agent does not get a master key. It can do what you can do, and it must stop before anything it cannot undo.

  • Your role on every call

    Each tool checks the role on that brand of the person who approved the agent. A manager can set hours but cannot invite an admin.

  • Deletes ask first

    Removing a team member or deleting a location needs an explicit yes. The agent must ask you before it sends it.

  • Access of its own

    Agent tokens reach the MCP server only. They cannot use the app API, the front desk or the scanners.

  • Short-lived tokens

    An agent token lasts one hour. The agent renews it in the background until you disconnect it.

  • Disconnect in one click

    Disconnect the agent in your account settings. Its next call fails.

  • Public means public

    The Directory server sees only what the public facility pages show. No emails, no members, no staff.

Questions about the MCP server

What is the Jymbro MCP server?

It is a connection between an AI assistant and Jymbro, built on the Model Context Protocol (MCP). The Brands server lets a brand team manage brands, locations, opening hours, disciplines and the team. The Directory server lets any agent search the public directory of gyms and sports facilities.

Which AI assistants work with it?

Any MCP client that supports remote servers over Streamable HTTP with OAuth sign-in, such as Claude Code, Cursor, VS Code, claude.ai and ChatGPT. The Directory server needs no sign-in.

How do I connect an agent?

Add the server address to your client. On the first call it opens Jymbro in the browser: sign in and approve the agent. There is no token to copy.

Can the agent delete things on its own?

No. The two tools that remove data, remove a team member and delete a location, only run with an explicit confirmation, and the agent must ask you for it. Every other change also follows your role on the brand.

How do I stop an agent?

Open Connected agents in your account settings and disconnect it. The next call from that agent fails.

What can the Directory server see?

Only what the public facility pages show: name, address, opening hours, amenities, disciplines, public events and the page URL. It sees nothing a brand team keeps private.

Give your assistant the keys to the front desk.

Paste one URL, sign in and ask for your first change. You stay in charge of every step.