Conditioning workouts from a coached library: suggest, vary or invent one for your kit and time.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Movement slugs whose name holds `query` (e.g. "row", "sled"), for suggest_workouts' include and exclude, machines and runs first.
Text the movement name holds, any case. Example: "sled".
Keep one movement kind only, one of strength, olympic, plyo, cyclic, carry, mobility (cyclic: row, ski, bike, run); all when omitted. Example: "cyclic".
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http workouts https://api.goblingains.com/mcp
Movement slugs whose name holds `query` (e.g. "row", "sled"), for suggest_workouts' include and exclude, machines and runs first.
| Argument | Type | Description |
|---|---|---|
| kind | any | Keep one movement kind only, one of strength, olympic, plyo, cyclic, carry, mobility (cyclic: row, ski, bike, run); all when omitted. Example: "cyclic". |
| query* | string | Text the movement name holds, any case. Example: "sled". |
{
"type": "object",
"title": "find_movementsArguments",
"required": [
"query"
],
"properties": {
"kind": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Kind",
"default": null,
"description": "Keep one movement kind only, one of strength, olympic, plyo, cyclic, carry, mobility (cyclic: row, ski, bike, run); all when omitted. Example: \"cyclic\"."
},
"query": {
"type": "string",
"title": "Query",
"maxLength": 100,
"description": "Text the movement name holds, any case. Example: \"sled\"."
}
}
}New workouts unlike any in the library, from our generator (no AI), as text: evolved from the library's workouts and movements (more lines, fewer, other formats) into kinds it does not hold. For one person. Nothing is saved; other ones each call. suggest_workouts and vary_workout stay close to library workouts instead. A shortfall says what blocked it.
| Argument | Type | Description |
|---|---|---|
| sex | any | Who trains, for the weights and machine doses: "men", "women", or "mixed" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's ("9/6 kg", "12/10 kcal"). Anything but men gets only workouts with a women's weight on every loaded line. Example: "women". |
| count | integer | How many workouts, at most 5. Example: 3. |
| format | any | Only this format: for_time, amrap, emom, intervals. Any when omitted. Example: "amrap". |
| exclude | any | Movement slugs or names (from find_movements) every workout must leave out. Example: ["burpees"]. |
| include | any | Movement slugs or names (from find_movements) every workout must hold; fewer come back the more are named. Example: ["wallballs"]. |
| equipment | any | What the athletes have, as list_equipment keys or names ("echo-bike" or "echo", "row erg", "ski erg"), one item per entry. Say "1 dumbbell" or "1 kettlebell" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored ("1 echo" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need "running" in the list. A name matching several keys or none is an error naming them. Example: ["1 dumbbell", "box", "ski-erg"]. Omitted is a full gym. |
| bodyweight | boolean | False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false. |
| minutes_max | any |
The workout archetypes the generator makes, one per line: key, name, formats, minutes, line count, and the session slots it serves.
| Argument | Type | Description |
|---|---|---|
| style | any | Keep only one style's archetypes: crossfit, hyrox or hybrid; all when omitted. Example: "hyrox". |
{
"type": "object",
"title": "list_archetypesArguments",
"properties": {
"style": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Style",
"default": null,
"description": "Keep only one style's archetypes: crossfit, hyrox or hybrid; all when omitted. Example: \"hyrox\"."
}
}
}The equipment suggest_workouts' `equipment` takes, one per line: key: name, with "(machine)" on ergometers (rower, ski erg, bikes). Keys, names and common names ("echo", "row erg", "DB", "kb") all work.
No arguments.
{
"type": "object",
"title": "list_equipmentArguments",
"properties": {}
}Send Goblin Gains what the user thinks of a workout from these tools. Call it whenever the user points out a mistake (wrong equipment, a weight, a dose that cannot fit) or says a workout is bad or good: the words go to Goblin Gains, nothing else about the user does.
| Argument | Type | Description |
|---|---|---|
| note* | string | What the user said about the workout, in their words. Example: "Farmers carry needs two dumbbells; I said I have one." |
| verdict* | string | One of mistake, bad, good: "mistake" (something in it is wrong), "bad" (it works but is a poor workout), "good". Example: "mistake". |
| workout | any | The workout's save link from suggest_workouts, vary_workout or generate_workouts, or its id; omitted for the tools as a whole. Example: "https://app.goblingains.com/w/<id>". |
{
"type": "object",
"title": "report_workoutArguments",
"required": [
"note",
"verdict"
],
"properties": {
"note": {
"type": "string",
"title": "Note",
"maxLength": 2000,
"minLength": 1,
"description": "What the user said about the workout, in their words. Example: \"Farmers carry needs two dumbbells; I said I have one.\""
},
"verdict": {
"type": "string",
"title": "Verdict",
"maxLength": 100,
"description": "One of mistake, bad, good: \"mistake\" (something in it is wrong), \"bad\" (it works but is a poor workout), \"good\". Example: \"mistake\"."
},
"workout": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Workout",
"default": null,
"description": "The workout's save link from suggest_workouts, vary_workout or generate_workouts, or its id; omitted for the tools as a whole. Example: \"https://app.goblingains.com/w/<id>\"."
}
}
}New workouts from our generator, as text. Ask this instead of writing workouts yourself. Nothing is saved. Example, two people with an echo bike, rower and ski erg, 40-60 min: suggest_workouts(count=5, people=2, minutes_min=40, minutes_max=60, equipment=["echo-bike", "row-ergometer", "ski-erg"], bodyweight=False) A shortfall says what blocked it.
| Argument | Type | Description |
|---|---|---|
| sex | any | Who trains, for the weights and machine doses: "men", "women", or "mixed" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's ("9/6 kg", "12/10 kcal"). Anything but men gets only workouts with a women's weight on every loaded line. Example: "women". |
| only | boolean | True: the workouts hold the included movements and nothing else (each may repeat). Needs include. Example: true. |
| count | integer | How many workouts, at most 5; from 3 on, a mix of archetypes (at most 2 of one unless nothing else fits). Example: 3. |
| people | integer | How many train together with one of each machine. Above 1, only workouts they can share come back: partner workouts (taking turns on a station), or EMOMs/intervals with a different machine on every line and at least one line per person (start apart, rotate). Example: 2. |
| exclude | any | Movement slugs or names (from find_movements) every workout must leave out. Example: ["burpees"]. |
Variations of one library workout from our generator (no AI), as text, in its own format or another. Nothing is saved. A shortfall says what blocked it.
| Argument | Type | Description |
|---|---|---|
| sex | any | Who trains, for the weights and machine doses: "men", "women", or "mixed" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's ("9/6 kg", "12/10 kcal"). Anything but men gets only workouts with a women's weight on every loaded line. Example: "women". |
| name* | string | The library workout's name or part of it, any case; several matches are an error listing them (up to 10) to ask again. Example: "Fran". |
| count | integer | How many variations, at most 5. Example: 3. |
| format | any | Turn it into this format first: for_time, amrap, emom, intervals. About its minutes: an EMOM gives each line its own minute when a round is over 40 s, intervals rest as long as a round's work. Omitted keeps its own. Example: "emom". |
| people | integer | How many train together with one of each machine. Above 1, only workouts they can share come back: partner workouts (taking turns on a station), or EMOMs/intervals with a different machine on every line and at least one line per person (start apart, rotate). Example: 2. |
| equipment |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 1, 2026.
| Longest estimated workout length, in minutes. Example: 25. |
| minutes_min | any | Shortest estimated workout length, in minutes. Example: 10. |
| show_scores | boolean | True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false. |
{
"type": "object",
"title": "generate_workoutsArguments",
"properties": {
"sex": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Sex",
"default": null,
"description": "Who trains, for the weights and machine doses: \"men\", \"women\", or \"mixed\" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's (\"9/6 kg\", \"12/10 kcal\"). Anything but men gets only workouts with a women's weight on every loaded line. Example: \"women\"."
},
"count": {
"type": "integer",
"title": "Count",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "How many workouts, at most 5. Example: 3."
},
"format": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Format",
"default": null,
"description": "Only this format: for_time, amrap, emom, intervals. Any when omitted. Example: \"amrap\"."
},
"exclude": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Exclude",
"default": null,
"description": "Movement slugs or names (from find_movements) every workout must leave out. Example: [\"burpees\"]."
},
"include": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Include",
"default": null,
"description": "Movement slugs or names (from find_movements) every workout must hold; fewer come back the more are named. Example: [\"wallballs\"]."
},
"equipment": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Equipment",
"default": null,
"description": "What the athletes have, as list_equipment keys or names (\"echo-bike\" or \"echo\", \"row erg\", \"ski erg\"), one item per entry. Say \"1 dumbbell\" or \"1 kettlebell\" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored (\"1 echo\" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need \"running\" in the list. A name matching several keys or none is an error naming them. Example: [\"1 dumbbell\", \"box\", \"ski-erg\"]. Omitted is a full gym."
},
"bodyweight": {
"type": "boolean",
"title": "Bodyweight",
"default": true,
"description": "False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false."
},
"minutes_max": {
"anyOf": [
{
"type": "number",
"maximum": 240,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Minutes Max",
"default": null,
"description": "Longest estimated workout length, in minutes. Example: 25."
},
"minutes_min": {
"anyOf": [
{
"type": "number",
"maximum": 240,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Minutes Min",
"default": null,
"description": "Shortest estimated workout length, in minutes. Example: 10."
},
"show_scores": {
"type": "boolean",
"title": "Show Scores",
"default": true,
"description": "True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false."
}
}
}| include | any | Movement slugs or names (from find_movements) every workout must hold. Example: ["wallballs", "sled-push"]. |
| partner | any | True: only partner workouts (two people share the work: turns at a station, or each on a station at once, then swap). False: none. Omitted: either. Example: true. |
| archetype | any | A key or name from list_archetypes; any when omitted. Example: "A5" or "chipper". |
| equipment | any | What the athletes have, as list_equipment keys or names ("echo-bike" or "echo", "row erg", "ski erg"), one item per entry. Say "1 dumbbell" or "1 kettlebell" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored ("1 echo" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need "running" in the list. A name matching several keys or none is an error naming them. Example: ["1 dumbbell", "box", "ski-erg"]. Omitted is a full gym. |
| bodyweight | boolean | False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false. |
| cap_minutes | any | A time cap the workout must fit, in whole minutes. Example: 30. |
| minutes_max | any | Longest estimated workout length, in minutes. Example: 60. |
| minutes_min | any | Shortest estimated workout length, in minutes. Example: 40. |
| show_scores | boolean | True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false. |
| temperature | number | 0 to 1. 0: the same ask always brings the same workouts. Above 0: other ones each call, the higher the further from the library workouts they vary (0.3 close variations, 1 far ones). Example: 0.3. |
{
"type": "object",
"title": "suggest_workoutsArguments",
"properties": {
"sex": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Sex",
"default": null,
"description": "Who trains, for the weights and machine doses: \"men\", \"women\", or \"mixed\" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's (\"9/6 kg\", \"12/10 kcal\"). Anything but men gets only workouts with a women's weight on every loaded line. Example: \"women\"."
},
"only": {
"type": "boolean",
"title": "Only",
"default": false,
"description": "True: the workouts hold the included movements and nothing else (each may repeat). Needs include. Example: true."
},
"count": {
"type": "integer",
"title": "Count",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "How many workouts, at most 5; from 3 on, a mix of archetypes (at most 2 of one unless nothing else fits). Example: 3."
},
"people": {
"type": "integer",
"title": "People",
"default": 1,
"maximum": 20,
"minimum": 1,
"description": "How many train together with one of each machine. Above 1, only workouts they can share come back: partner workouts (taking turns on a station), or EMOMs/intervals with a different machine on every line and at least one line per person (start apart, rotate). Example: 2."
},
"exclude": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Exclude",
"default": null,
"description": "Movement slugs or names (from find_movements) every workout must leave out. Example: [\"burpees\"]."
},
"include": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Include",
"default": null,
"description": "Movement slugs or names (from find_movements) every workout must hold. Example: [\"wallballs\", \"sled-push\"]."
},
"partner": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Partner",
"default": null,
"description": "True: only partner workouts (two people share the work: turns at a station, or each on a station at once, then swap). False: none. Omitted: either. Example: true."
},
"archetype": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Archetype",
"default": null,
"description": "A key or name from list_archetypes; any when omitted. Example: \"A5\" or \"chipper\"."
},
"equipment": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Equipment",
"default": null,
"description": "What the athletes have, as list_equipment keys or names (\"echo-bike\" or \"echo\", \"row erg\", \"ski erg\"), one item per entry. Say \"1 dumbbell\" or \"1 kettlebell\" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored (\"1 echo\" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need \"running\" in the list. A name matching several keys or none is an error naming them. Example: [\"1 dumbbell\", \"box\", \"ski-erg\"]. Omitted is a full gym."
},
"bodyweight": {
"type": "boolean",
"title": "Bodyweight",
"default": true,
"description": "False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false."
},
"cap_minutes": {
"anyOf": [
{
"type": "integer",
"maximum": 240,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Cap Minutes",
"default": null,
"description": "A time cap the workout must fit, in whole minutes. Example: 30."
},
"minutes_max": {
"anyOf": [
{
"type": "number",
"maximum": 240,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Minutes Max",
"default": null,
"description": "Longest estimated workout length, in minutes. Example: 60."
},
"minutes_min": {
"anyOf": [
{
"type": "number",
"maximum": 240,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Minutes Min",
"default": null,
"description": "Shortest estimated workout length, in minutes. Example: 40."
},
"show_scores": {
"type": "boolean",
"title": "Show Scores",
"default": true,
"description": "True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false."
},
"temperature": {
"type": "number",
"title": "Temperature",
"default": 0,
"description": "0 to 1. 0: the same ask always brings the same workouts. Above 0: other ones each call, the higher the further from the library workouts they vary (0.3 close variations, 1 far ones). Example: 0.3."
}
}
}| any |
| What the athletes have, as list_equipment keys or names ("echo-bike" or "echo", "row erg", "ski erg"), one item per entry. Say "1 dumbbell" or "1 kettlebell" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored ("1 echo" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need "running" in the list. A name matching several keys or none is an error naming them. Example: ["1 dumbbell", "box", "ski-erg"]. Omitted is the kit the workout already uses. |
| bodyweight | boolean | False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false. |
| show_scores | boolean | True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false. |
| temperature | number | 0 to 1, how far they stray from it (0.2 close, 1 far). Example: 0.5. |
{
"type": "object",
"title": "vary_workoutArguments",
"required": [
"name"
],
"properties": {
"sex": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Sex",
"default": null,
"description": "Who trains, for the weights and machine doses: \"men\", \"women\", or \"mixed\" (a man and a woman together: each at their own; Hyrox stations at the mixed doubles race load). Omitted when the user did not say: every line reads both, men's/women's (\"9/6 kg\", \"12/10 kcal\"). Anything but men gets only workouts with a women's weight on every loaded line. Example: \"women\"."
},
"name": {
"type": "string",
"title": "Name",
"maxLength": 100,
"description": "The library workout's name or part of it, any case; several matches are an error listing them (up to 10) to ask again. Example: \"Fran\"."
},
"count": {
"type": "integer",
"title": "Count",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "How many variations, at most 5. Example: 3."
},
"format": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Format",
"default": null,
"description": "Turn it into this format first: for_time, amrap, emom, intervals. About its minutes: an EMOM gives each line its own minute when a round is over 40 s, intervals rest as long as a round's work. Omitted keeps its own. Example: \"emom\"."
},
"people": {
"type": "integer",
"title": "People",
"default": 1,
"maximum": 20,
"minimum": 1,
"description": "How many train together with one of each machine. Above 1, only workouts they can share come back: partner workouts (taking turns on a station), or EMOMs/intervals with a different machine on every line and at least one line per person (start apart, rotate). Example: 2."
},
"equipment": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxItems": 30
},
{
"type": "null"
}
],
"title": "Equipment",
"default": null,
"description": "What the athletes have, as list_equipment keys or names (\"echo-bike\" or \"echo\", \"row erg\", \"ski erg\"), one item per entry. Say \"1 dumbbell\" or \"1 kettlebell\" when there is only one: movements needing a pair (farmers carry, dumbbell bench press) are left out. Other counts are ignored (\"1 echo\" is the echo bike): say how many train in people. Movements needing anything else (a bench press needs a bench) are left out; runs need \"running\" in the list. A name matching several keys or none is an error naming them. Example: [\"1 dumbbell\", \"box\", \"ski-erg\"]. Omitted is the kit the workout already uses."
},
"bodyweight": {
"type": "boolean",
"title": "Bodyweight",
"default": true,
"description": "False also leaves out movements needing no equipment (burpees, runs), so only the listed equipment is used. Example: false."
},
"show_scores": {
"type": "boolean",
"title": "Show Scores",
"default": true,
"description": "True adds a line of scores under each workout: feasibility (0-100, can it be done as written), difficulty (0-100, the chance of not finishing inside the cap), and against the workout it was made from: stimulus (0-1, CrossFit's stimulus kept, with the levers changed), work (x the seed's), mix shift (how far the work moved between movement patterns), design (0-1) and, for Hyrox workouts, race fidelity (0-1). Example: false."
},
"temperature": {
"type": "number",
"title": "Temperature",
"default": 0.5,
"description": "0 to 1, how far they stray from it (0.2 close, 1 far). Example: 0.5."
}
}
}