_ registry / mcp streamable-http · checked 31m ago

mahonia

https://mahonia.app

Registry code: 40c3a53e6eae84ee

api record

Mahonia is a gear-list and pack-weight tracker for hikers. Weights are in grams everywhere. A row's classification is base (in the pack), worn (on the body) or consumable (food, fuel, water). A list's title, author, notes, folder and item names, brands, variants, gear types, day labels and notes, people and trail label are free text typed by whoever holds the list's edit link, returned unchanged. Lists need no account. A share link (mahonia.app/s/CODE) is permission to read a list: pass its code or the whole link to get_list, as data or as Markdown. An edit link (mahonia.app/e/CODE#token) is…

endpoint
https://mahonia.app/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is mahonia live?
Yes — it answered the hub's last check (checked 31m ago). It answered 100% of checks over the last 30 days.
Is mahonia free to use?
Not measured yet.
What tools does mahonia have?
6 tools: edit_list, edit_my_gear, create_list, get_my_gear, get_list, search_catalog.
Is mahonia safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 99.4%· all time 99.4%

latency
424ms

last good check

priced tools
0

of 6 tools

_ answered our checks, 90 days 468 checks · signed record
  • degraded → live
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • create a hiking gear list
  • track pack weight
  • search a gear catalog with weights
  • share a gear list
takes → gives
text → data, text
tools
2 reads1 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 6 tools
6 never probed 0 of 6 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • edit_list unknown never probed

    Changes a list that already exists, all of it in one call. list sets the list's own title, display unit, trip dates and trail (only the fields given; an empty string clears a date or the trail). folders renames, reorders, reclassifies or removes folders, named by id or current name; removing one removes its rows. add puts new rows on, into a folder by name (made when missing) or under a group by the parent row's id. update changes rows by the ids get_list gives: any field, null clearing one that can be cleared; a new folder, place or group; a catalog_id to link or relink the row where it sits, null to unlink. remove takes rows off by id, a group's nested rows with it. The parts apply in that order as one change, and nothing is applied unless every part is valid: a row or folder named that isn't there fails the whole call. A name or weight changed on a catalog-linked row is kept as the owner's own. Takes the list's edit link, or its share code under a signed-in account that has filed it.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "add": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "qty": {
                "type": "integer",
                "maximum": 9999,
                "minimum": 1,
                "description": "How many. Default 1."
              },
              "kcal": {
                "type": "integer",
                "minimum": 0,
                "description": "Calories per unit, for food."
              },
              "name": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "description": "The product or item name. Required."
              },
              "note": {
                "type": "string",
                "maxLength": 2000,
                "description": "A short free-text note on the row."
              },
              "brand": {
                "type": "string",
                "maxLength": 120,
                "description": "The maker, when known."
              },
              "group": {
                "type": "string",
                "description": "The id of a top-level row already on the list, from get_list, to nest this row under: it joins that group, in the group's folder. Not with folder or items."
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name"
                  ],
                  "properties": {
                    "qty": {
                      "type": "integer",
                      "maximum": 9999,
                      "minimum": 1,
                      "description": "How many. Default 1."
                    },
                    "kcal": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Calories per unit, for food."
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 200,
                      "minLength": 1,
                      "description": "The product or item name. Required."
                    },
                    "note": {
                      "type": "string",
                      "maxLength": 2000,
                      "description": "A short free-text note on the row."
                    },
                    "brand": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The maker, when known."
                    },
                    "variant": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "Size, length or configuration that changes the weight, such as Long or 20F."
                    },
                    "weight_g": {
                      "type": "number",
                      "minimum": 0,
                      "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
                    },
                    "worn_qty": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
                    },
                    "gear_type": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "What kind of thing it is: Tent, Quilt, Trail runners."
                    },
                    "catalog_id": {
                      "type": "integer",
                      "maximum": 2147483647,
                      "minimum": 1,
                      "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
                    },
                    "needs_cooking": {
                      "type": "boolean",
                      "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
                    },
                    "classification": {
                      "enum": [
                        "base",
                        "worn",
                        "consumable"
                      ],
                      "type": "string",
                      "description": "base, worn or consumable. Omit to follow the folder's default."
                    }
                  }
                },
                "description": "Rows nested under this one, making it a group: stakes under a tent, snacks under a day. One level deep; a nested row is in its parent's folder."
              },
              "folder": {
                "type": "string",
                "maxLength": 120,
                "description": "The folder to put it in, by name. Created when the list has no folder of that name."
              },
              "variant": {
                "type": "string",
                "maxLength": 120,
                "description": "Size, length or configuration that changes the weight, such as Long or 20F."
              },
              "weight_g": {
                "type": "number",
                "minimum": 0,
                "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
              },
              "worn_qty": {
                "type": "integer",
                "minimum": 0,
                "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
              },
              "gear_type": {
                "type": "string",
                "maxLength": 120,
                "description": "What kind of thing it is: Tent, Quilt, Trail runners."
              },
              "catalog_id": {
                "type": "integer",
                "maximum": 2147483647,
                "minimum": 1,
                "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
              },
              "needs_cooking": {
                "type": "boolean",
                "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable"
                ],
                "type": "string",
                "description": "base, worn or consumable. Omit to follow the folder's default."
              }
            }
          },
          "description": "New rows. Each may name its folder, or the group to join."
        },
        "list": {
          "type": "object",
          "properties": {
            "unit": {
              "enum": [
                "g",
                "kg",
                "oz",
                "lb"
              ],
              "type": "string",
              "description": "The unit the list displays in. Weights are in grams regardless."
            },
            "title": {
              "type": "string",
              "maxLength": 200
            },
            "end_date": {
              "type": "string",
              "description": "YYYY-MM-DD, or an empty string to clear."
            },
            "trail_url": {
              "type": "string",
              "maxLength": 2000,
              "description": "An http(s) link, or an empty string to clear the trail and everything that came with it (label, distance, climb, route)."
            },
            "start_date": {
              "type": "string",
              "description": "YYYY-MM-DD, or an empty string to clear."
            },
            "trail_label": {
              "type": "string",
              "maxLength": 120
            },
            "trail_distance_km": {
              "type": "number",
              "minimum": 0,
              "description": "Stored in metres and shown in the list's own distance unit."
            }
          },
          "description": "The list's own fields. Only the fields given change."
        },
        "again": {
          "type": "boolean",
          "description": "A call with rows to add that is identical to one made in the last ten minutes is taken as a retry and does nothing: the earlier result comes back with repeated set. Pass true to make the same change a second time on purpose."
        },
        "remove": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 200,
          "description": "Ids of rows to take off, from get_list."
        },
        "update": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "The row's id, from get_list."
              },
              "qty": {
                "type": "integer",
                "maximum": 9999,
                "minimum": 1
              },
              "kcal": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 0,
                "description": "Calories per unit, for food. Null clears it."
              },
              "name": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "description": "A new name. A row keeps a name; it can't be cleared."
              },
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 2000,
                "description": "The row's note. Null clears it."
              },
              "brand": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "The maker. Null clears it."
              },
              "group": {
                "type": "string",
                "description": "Nest the row under this top-level row, by its id from get_list, in that row's folder; an empty string takes it out of its group, to the top level of its folder. A row with rows under it can't be nested."
              },
              "folder": {
                "type": "string",
                "maxLength": 120,
                "description": "Move the row to this folder, by name; a new name makes the folder, and an empty string takes it out of every folder. A nested row moved to another folder comes out of its group."
              },
              "variant": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Size, length or configuration. Null clears it."
              },
              "position": {
                "type": "integer",
                "minimum": 0,
                "description": "Where the row goes among its neighbours, 0 for first. Without it a row moved to another folder or group goes last."
              },
              "weight_g": {
                "type": "number",
                "minimum": 0,
                "description": "Weight of ONE unit, in grams. Kept as your own figure on a row picked from the catalog."
              },
              "worn_qty": {
                "type": "integer",
                "minimum": 0,
                "description": "Of qty, how many are worn rather than carried; 0 removes the split."
              },
              "gear_type": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "What kind of thing it is. Null clears it."
              },
              "carried_by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Who carries it, by the name the list gives that person. Null clears it."
              },
              "catalog_id": {
                "type": [
                  "integer",
                  "null"
                ],
                "maximum": 2147483647,
                "minimum": 1,
                "description": "Link or relink the row to this catalog row, from search_catalog: it takes the catalog's brand, name, variant, gear type and cited weight, follows catalog corrections, and keeps its folder, place and group. A name, weight_g or gear_type given in the same change is kept as your own. Null unlinks the row, leaving it as it reads."
              },
              "needs_cooking": {
                "type": "boolean"
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable",
                  null
                ],
                "type": [
                  "string",
                  "null"
                ],
                "description": "base, worn or consumable; null to follow the folder's default."
              }
            }
          },
          "maxItems": 200,
          "description": "Changes to rows that exist, each by id."
        },
        "folders": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "folder"
            ],
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120,
                "minLength": 1,
                "description": "A new name, unique in the list."
              },
              "folder": {
                "type": "string",
                "description": "The folder's id from get_list, or its current name."
              },
              "remove": {
                "type": "boolean",
                "description": "True to remove the folder and every row in it."
              },
              "position": {
                "type": "integer",
                "minimum": 0,
                "description": "Its place in the list's folder order, 0 for first."
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable"
                ],
                "type": "string",
                "description": "What rows in this folder count as unless they say otherwise."
              }
            }
          },
          "maxItems": 200,
          "description": "Changes to folders that exist."
        },
        "edit_link": {
          "type": "string",
          "description": "The list's edit link, whole (mahonia.app/e/CODE#token). The part after # is the write capability. Leave it out to name a list filed under the signed-in account by share_code instead."
        },
        "share_code": {
          "type": "string",
          "description": "Instead of the edit link: the share code or share link of a list filed under the connector's account, as get_list with no share_code gives it. Takes a sign-in with read-and-change access, and reaches only the lists that account has filed."
        }
      }
    }
    arguments 397 lines
  • edit_my_gear unknown never probed

    Changes the connector's account's My Gear, in one call. add puts new pieces in; one the account already holds (same brand, name and variant) comes back as already_have and is left as it was. update changes pieces by the ids get_my_gear gives, only the fields sent, null clearing one. A piece that names a catalog_id, as it is added or later, is linked to that catalog row and takes its brand, name, variant, gear type and weight where none were given; null unlinks it. remove puts pieces away by id: they stop being offered on lists, and the lists that still carry them will not bring them back. restore brings put-away pieces back. kit, on a piece added or updated, makes it a kit of other pieces by id (replacing what it held), and null on update turns a kit back into a single piece; a kit's weight is its items', so a kit takes own_weight_g, never weight_g. Each piece answers for itself, in the order sent, with a reason when it wasn't done as sent. What is added or changed here counts as the owner's own word on the piece, so a list saved later cannot overwrite it. Needs read-and-change access.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "add": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "kit": {
                "type": "object",
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "A piece of My Gear, from get_my_gear."
                        },
                        "count": {
                          "type": "integer",
                          "maximum": 99,
                          "minimum": 1,
                          "description": "How many of it the kit holds. Default 1, and never more than the piece's owned: a higher count is held to it, so raise owned first."
                        }
                      }
                    },
                    "maxItems": 100,
                    "minItems": 1
                  },
                  "own_weight_g": {
                    "type": "number",
                    "minimum": 0,
                    "description": "What the kit weighs by itself, a stuff sack or a strap, in grams. Default 0."
                  }
                },
                "description": "Makes the piece a KIT: a set kept together, such as a cook kit or a sleep system, that weighs its own weight plus its items'. items REPLACES whatever it held: pieces of My Gear by id, each with how many, none of them a kit (kits are one level deep), and a piece already in a kit can't become one. A piece can be in several kits. Not with weight_g: set own_weight_g for what the kit weighs by itself."
              },
              "kcal": {
                "type": "integer",
                "minimum": 0,
                "description": "Calories in one, for food."
              },
              "name": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "description": "The product or item name, without brand or variant."
              },
              "brand": {
                "type": "string",
                "maxLength": 120,
                "description": "The maker."
              },
              "owned": {
                "type": "integer",
                "maximum": 999,
                "minimum": 1,
                "description": "How many of it the owner has, when more than one: three of the same bottle is one piece with owned 3, not three pieces."
              },
              "price": {
                "type": "number",
                "minimum": 0,
                "description": "What one cost, in the currency's main unit: 199.95."
              },
              "variant": {
                "type": "string",
                "maxLength": 120,
                "description": "Size, length or rating: Long, 20F."
              },
              "currency": {
                "type": "string",
                "maxLength": 3,
                "minLength": 3,
                "description": "ISO 4217 code for price, such as USD. Ignored without a price."
              },
              "weight_g": {
                "type": "number",
                "minimum": 0,
                "description": "Grams for one. 0 records it as not weighed yet."
              },
              "gear_type": {
                "type": "string",
                "maxLength": 120,
                "description": "What kind of thing it is: Tent, Quilt."
              },
              "catalog_id": {
                "type": "integer",
                "maximum": 2147483647,
                "minimum": 1,
                "description": "A catalog row from search_catalog. The piece takes the catalog's brand, name, variant, gear type and weight, each unless given here; a name can be left out."
              },
              "product_url": {
                "type": "string",
                "maxLength": 2000,
                "description": "The maker's or a shop's page for it."
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable"
                ],
                "type": "string",
                "description": "base, worn or consumable."
              }
            }
          },
          "maxItems": 50,
          "description": "New pieces, each with a name or a catalog_id."
        },
        "remove": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "maxItems": 50,
          "description": "Ids of pieces to put away."
        },
        "update": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id"
            ],
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1
              },
              "kit": {
                "type": [
                  "object",
                  "null"
                ],
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "id"
                      ],
                      "properties": {
                        "id": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "A piece of My Gear, from get_my_gear."
                        },
                        "count": {
                          "type": "integer",
                          "maximum": 99,
                          "minimum": 1,
                          "description": "How many of it the kit holds. Default 1, and never more than the piece's owned: a higher count is held to it, so raise owned first."
                        }
                      }
                    },
                    "maxItems": 100,
                    "minItems": 1
                  },
                  "own_weight_g": {
                    "type": "number",
                    "minimum": 0,
                    "description": "What the kit weighs by itself, a stuff sack or a strap, in grams. Default 0."
                  }
                },
                "description": "Makes the piece a KIT: a set kept together, such as a cook kit or a sleep system, that weighs its own weight plus its items'. items REPLACES whatever it held: pieces of My Gear by id, each with how many, none of them a kit (kits are one level deep), and a piece already in a kit can't become one. A piece can be in several kits. Not with weight_g: set own_weight_g for what the kit weighs by itself. Null turns a kit back into a single piece, weighing what the kit did; its items stay as the pieces they are."
              },
              "kcal": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 0,
                "description": "Calories in one, for food. Null clears it."
              },
              "name": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "description": "The product or item name, without brand or variant."
              },
              "brand": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "The maker. Null clears it."
              },
              "owned": {
                "type": [
                  "integer",
                  "null"
                ],
                "maximum": 999,
                "minimum": 1,
                "description": "How many of it the owner has, when more than one: three of the same bottle is one piece with owned 3, not three pieces. Null sets it back to one."
              },
              "price": {
                "type": [
                  "number",
                  "null"
                ],
                "minimum": 0,
                "description": "What one cost, in the currency's main unit: 199.95. Null clears it."
              },
              "variant": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Size, length or rating: Long, 20F. Null clears it."
              },
              "currency": {
                "type": "string",
                "maxLength": 3,
                "minLength": 3,
                "description": "ISO 4217 code for price, such as USD. Ignored without a price."
              },
              "weight_g": {
                "type": "number",
                "minimum": 0,
                "description": "Grams for one. 0 records it as not weighed yet."
              },
              "gear_type": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "What kind of thing it is: Tent, Quilt. Null clears it."
              },
              "catalog_id": {
                "type": [
                  "integer",
                  "null"
                ],
                "maximum": 2147483647,
                "minimum": 1,
                "description": "Link or relink the piece to this catalog row, from search_catalog: it takes the catalog's brand, name, variant, gear type and weight, each unless given here. Null unlinks it, leaving the piece as it reads."
              },
              "product_url": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 2000,
                "description": "The maker's or a shop's page for it. Null clears it."
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable",
                  null
                ],
                "type": [
                  "string",
                  "null"
                ],
                "description": "base, worn or consumable. Null clears it."
              }
            }
          },
          "maxItems": 50,
          "description": "Changes to pieces that exist, each by id."
        },
        "restore": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "maxItems": 50,
          "description": "Ids of put-away pieces to bring back."
        }
      }
    }
    arguments 293 lines
  • create_list changes data unknown never probed

    Creates a list and returns its edit link and share link. Optionally with a title, unit, trip dates, a trail link and rows, grouped into folders; a row with items nested under it is a group (stakes under a tent, snacks under a day). Keep the edit link: it is the only way to change a list that isn't filed under an account. With read-and-change access to an account the list is filed under it too, and saved_to_account says whether it was; otherwise the list belongs to whoever holds the edit link, as every list does.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "unit": {
          "enum": [
            "g",
            "kg",
            "oz",
            "lb"
          ],
          "type": "string",
          "description": "The unit the list displays in. Weights are in grams regardless."
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "qty": {
                "type": "integer",
                "maximum": 9999,
                "minimum": 1,
                "description": "How many. Default 1."
              },
              "kcal": {
                "type": "integer",
                "minimum": 0,
                "description": "Calories per unit, for food."
              },
              "name": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "description": "The product or item name. Required."
              },
              "note": {
                "type": "string",
                "maxLength": 2000,
                "description": "A short free-text note on the row."
              },
              "brand": {
                "type": "string",
                "maxLength": 120,
                "description": "The maker, when known."
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name"
                  ],
                  "properties": {
                    "qty": {
                      "type": "integer",
                      "maximum": 9999,
                      "minimum": 1,
                      "description": "How many. Default 1."
                    },
                    "kcal": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Calories per unit, for food."
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 200,
                      "minLength": 1,
                      "description": "The product or item name. Required."
                    },
                    "note": {
                      "type": "string",
                      "maxLength": 2000,
                      "description": "A short free-text note on the row."
                    },
                    "brand": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The maker, when known."
                    },
                    "variant": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "Size, length or configuration that changes the weight, such as Long or 20F."
                    },
                    "weight_g": {
                      "type": "number",
                      "minimum": 0,
                      "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
                    },
                    "worn_qty": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
                    },
                    "gear_type": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "What kind of thing it is: Tent, Quilt, Trail runners."
                    },
                    "catalog_id": {
                      "type": "integer",
                      "maximum": 2147483647,
                      "minimum": 1,
                      "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
                    },
                    "needs_cooking": {
                      "type": "boolean",
                      "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
                    },
                    "classification": {
                      "enum": [
                        "base",
                        "worn",
                        "consumable"
                      ],
                      "type": "string",
                      "description": "base, worn or consumable. Omit to follow the folder's default."
                    }
                  }
                },
                "description": "Rows nested under this one, making it a group: stakes under a tent, snacks under a day. One level deep; a nested row is in its parent's folder."
              },
              "folder": {
                "type": "string",
                "maxLength": 120,
                "description": "The folder to put it in, by name. Created when the list has no folder of that name."
              },
              "variant": {
                "type": "string",
                "maxLength": 120,
                "description": "Size, length or configuration that changes the weight, such as Long or 20F."
              },
              "weight_g": {
                "type": "number",
                "minimum": 0,
                "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
              },
              "worn_qty": {
                "type": "integer",
                "minimum": 0,
                "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
              },
              "gear_type": {
                "type": "string",
                "maxLength": 120,
                "description": "What kind of thing it is: Tent, Quilt, Trail runners."
              },
              "catalog_id": {
                "type": "integer",
                "maximum": 2147483647,
                "minimum": 1,
                "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
              },
              "needs_cooking": {
                "type": "boolean",
                "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable"
                ],
                "type": "string",
                "description": "base, worn or consumable. Omit to follow the folder's default."
              }
            }
          },
          "description": "Rows not placed through a folder above; each may name its folder."
        },
        "title": {
          "type": "string",
          "maxLength": 200
        },
        "folders": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120,
                "minLength": 1
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name"
                  ],
                  "properties": {
                    "qty": {
                      "type": "integer",
                      "maximum": 9999,
                      "minimum": 1,
                      "description": "How many. Default 1."
                    },
                    "kcal": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Calories per unit, for food."
                    },
                    "name": {
                      "type": "string",
                      "maxLength": 200,
                      "minLength": 1,
                      "description": "The product or item name. Required."
                    },
                    "note": {
                      "type": "string",
                      "maxLength": 2000,
                      "description": "A short free-text note on the row."
                    },
                    "brand": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The maker, when known."
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "name"
                        ],
                        "properties": {
                          "qty": {
                            "type": "integer",
                            "maximum": 9999,
                            "minimum": 1,
                            "description": "How many. Default 1."
                          },
                          "kcal": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Calories per unit, for food."
                          },
                          "name": {
                            "type": "string",
                            "maxLength": 200,
                            "minLength": 1,
                            "description": "The product or item name. Required."
                          },
                          "note": {
                            "type": "string",
                            "maxLength": 2000,
                            "description": "A short free-text note on the row."
                          },
                          "brand": {
                            "type": "string",
                            "maxLength": 120,
                            "description": "The maker, when known."
                          },
                          "variant": {
                            "type": "string",
                            "maxLength": 120,
                            "description": "Size, length or configuration that changes the weight, such as Long or 20F."
                          },
                          "weight_g": {
                            "type": "number",
                            "minimum": 0,
                            "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
                          },
                          "worn_qty": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
                          },
                          "gear_type": {
                            "type": "string",
                            "maxLength": 120,
                            "description": "What kind of thing it is: Tent, Quilt, Trail runners."
                          },
                          "catalog_id": {
                            "type": "integer",
                            "maximum": 2147483647,
                            "minimum": 1,
                            "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
                          },
                          "needs_cooking": {
                            "type": "boolean",
                            "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
                          },
                          "classification": {
                            "enum": [
                              "base",
                              "worn",
                              "consumable"
                            ],
                            "type": "string",
                            "description": "base, worn or consumable. Omit to follow the folder's default."
                          }
                        }
                      },
                      "description": "Rows nested under this one, making it a group: stakes under a tent, snacks under a day. One level deep; a nested row is in its parent's folder."
                    },
                    "folder": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The folder to put it in, by name. Created when the list has no folder of that name."
                    },
                    "variant": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "Size, length or configuration that changes the weight, such as Long or 20F."
                    },
                    "weight_g": {
                      "type": "number",
                      "minimum": 0,
                      "description": "Weight of ONE unit, in grams. Omit when unknown; the list keeps working without it, and a row with a catalog_id takes the catalog's cited weight."
                    },
                    "worn_qty": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Of qty, how many are worn rather than carried (three pairs of socks, one on your feet). For a row that is entirely worn, set classification to worn instead."
                    },
                    "gear_type": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "What kind of thing it is: Tent, Quilt, Trail runners."
                    },
                    "catalog_id": {
                      "type": "integer",
                      "maximum": 2147483647,
                      "minimum": 1,
                      "description": "A catalog row id from search_catalog. The row takes the catalog's brand, name, variant, gear type and cited weight, and follows catalog corrections; a weight_g given as well is kept as your own figure."
                    },
                    "needs_cooking": {
                      "type": "boolean",
                      "description": "Food to cook on this trip. Each unit assumes one boil for a rough fuel estimate; no quantity or weight changes."
                    },
                    "classification": {
                      "enum": [
                        "base",
                        "worn",
                        "consumable"
                      ],
                      "type": "string",
                      "description": "base, worn or consumable. Omit to follow the folder's default."
                    }
                  }
                }
              },
              "classification": {
                "enum": [
                  "base",
                  "worn",
                  "consumable"
                ],
                "type": "string",
                "description": "What rows in this folder count as unless they say otherwise. Default base."
              }
            }
          },
          "description": "Folders in order, each with its default classification and, optionally, its rows."
        },
        "end_date": {
          "type": "string",
          "description": "YYYY-MM-DD"
        },
        "trail_url": {
          "type": "string",
          "maxLength": 2000,
          "description": "An http(s) link to the route or trail page."
        },
        "start_date": {
          "type": "string",
          "description": "YYYY-MM-DD"
        },
        "trail_label": {
          "type": "string",
          "maxLength": 120,
          "description": "What to call the trail, when the link's own name won't do."
        },
        "trail_distance_km": {
          "type": "number",
          "minimum": 0
        }
      }
    }
    arguments 388 lines
  • get_my_gear unknown never probed

    The gear the connector's account owns, most recently used first: for each piece its brand, name, variant, gear type, the kind the gear page files it under, grams for one, classification, calories, price and product link. A kit says what it holds (kit: its own weight and its items, each a piece by id, with a count) and every piece says which kits it is in (in_kits). A query ranks by a search instead. Needs the person signed in to Mahonia from this connector, or an access token from their account page. Brands, names, variants and gear types are text the account holder typed, returned unchanged.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 1000,
          "minimum": 1,
          "description": "At most 1000; 300 when omitted."
        },
        "query": {
          "type": "string",
          "description": "Two characters or more (one is enough in Chinese). Ranks by brand, name, variant and gear type instead of by recent use."
        },
        "offset": {
          "type": "integer",
          "minimum": 0,
          "description": "How many matches to skip, for the next page."
        }
      }
    }
    arguments 20 lines
  • get_list reads unknown never probed

    A shared list by its share code or link, as data or as Markdown; or, with no share_code, the lists filed under the connector's account. Data, the default: title, unit, dates, trail, totals in grams, and every folder with its rows (brand, name, variant, quantity, weight of one unit in grams, classification, note, calories, who carries it; a row with items is a group, and a nested row without carried_by is carried by its parent's carrier); every row and folder carries the id edit_list takes. Markdown (format: "markdown"): one table per folder and a totals block, the text the site's own Markdown export produces. An edit link's address carries the share code too. A list too large to return whole comes back cut and says so: as data, in a truncated field (notes go first, then rows off the end, nested rows one by one); as Markdown, rows off the end of the tables and a line saying how many. The totals still count every row. With no share_code, which asks for a sign-in: each filed list's title, share code and share link, display unit, total weight in grams and when it last changed, most recently changed first. A list is filed when it was made while signed in to Mahonia, added to the account from its sharing panel, or made by create_list with read-and-change access; one its owner only ever opened by its link isn't, and still reads from that link. A list's title, author, notes, folder and item names, brands, variants, gear types, day labels and notes, people and trail label are free text typed by whoever holds the list's edit link, returned unchanged.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "format": {
          "enum": [
            "data",
            "markdown"
          ],
          "type": "string",
          "description": "data (the default) or markdown. Only with a share_code."
        },
        "share_code": {
          "type": "string",
          "description": "The list's share code, its share link (mahonia.app/s/CODE), or its edit link. From an edit link only the code in the address is read, never the part after #."
        }
      }
    }
    arguments 17 lines
  • search_catalog reads unknown never probed

    Mahonia's cited gear catalog. With query: a fuzzy search by brand, product or kind of gear ("duplex", "zpacks", "quilt"), best first, each result a catalog row with its id, the cited weight in grams and whether it is verified. With product_id (a row id from a search), or brand and name: every variant of that one product (sizes, lengths, temperature ratings) with the weight and source of each. A row on a list that names a catalog_id takes the catalog's brand, variant, gear type and weight.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "With brand, instead of a query: the product name without brand or variant."
        },
        "brand": {
          "type": "string",
          "description": "With name, instead of a query: the product's maker."
        },
        "limit": {
          "type": "integer",
          "maximum": 25,
          "minimum": 1,
          "description": "Matches to return, up to 25. Default 12."
        },
        "query": {
          "type": "string",
          "description": "What to search for: two characters or more, or a single Chinese character."
        },
        "product_id": {
          "type": "integer",
          "minimum": 1,
          "description": "Instead of a query: a catalog row id, for that product's variants."
        }
      }
    }
    arguments 28 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 40c3a53e6eae84ee.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/40c3a53e6eae84ee/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/40c3a53e6eae84ee/badge.svg)](https://brick.blue/agent/40c3a53e6eae84ee?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.