{"name":"app.mahonia/mahonia","slug":"mahonia","title":"Mahonia","description":"Read and edit Mahonia backpacking gear lists via share and edit links; no account needed.","url":"https://mcp.market/server/mahonia","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":0,"forks":1,"downloads_week":null,"last_push_at":"2026-11-01T15:57:51.000Z","license":"NOASSERTION"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-05T14:30:41.664Z","last_ok_at":"2026-11-05T14:30:41.664Z","latency_ms":282},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/ryankiley/mahonia","website":"https://mahonia.app/about","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://mahonia.app/mcp"}],"packages":[],"tools":[{"name":"add_items","description":"Adds rows to an existing list. Takes the list's edit link and the rows; each row may name a folder, and a folder that doesn't exist yet is created.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"edit_link":{"type":"string","description":"The list's edit link, whole (mahonia.app/e/CODE#token). The part after # is the write capability."},"items":{"type":"array","minItems":1,"items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."},"folder":{"type":"string","maxLength":120,"description":"The folder to put it in, by name. Created when the list has no folder of that name."}},"required":["name"]}},"folder":{"type":"string","maxLength":120,"description":"A folder name for every row that doesn't name its own."},"again":{"type":"boolean","description":"A call identical to one made in the last ten minutes is taken as a retry and adds nothing: the earlier result comes back with repeated set. Pass true to add the same rows a second time on purpose."}},"required":["edit_link","items"]}},{"name":"create_list","description":"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. If this connector carries a read-and-write access token the list is filed under that account too, and saved_to_account says whether it was; otherwise the list belongs to whoever holds the edit link, as every list does.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"unit":{"type":"string","enum":["g","kg","oz","lb"],"description":"The unit the list displays in. Weights are in grams regardless."},"start_date":{"type":"string","description":"YYYY-MM-DD"},"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."},"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},"folders":{"type":"array","description":"Folders in order, each with its default classification and, optionally, its rows.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"What rows in this folder count as unless they say otherwise. Default base."},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."},"folder":{"type":"string","maxLength":120,"description":"The folder to put it in, by name. Created when the list has no folder of that name."},"items":{"type":"array","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.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."}},"required":["name"]}}},"required":["name"]}}},"required":["name"]}},"items":{"type":"array","description":"Rows not placed through a folder above; each may name its folder.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."},"folder":{"type":"string","maxLength":120,"description":"The folder to put it in, by name. Created when the list has no folder of that name."},"items":{"type":"array","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.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."}},"required":["name"]}}},"required":["name"]}}}}},{"name":"edit_list","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"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."},"list":{"type":"object","description":"The list's own fields. Only the fields given change.","properties":{"title":{"type":"string","maxLength":200},"unit":{"type":"string","enum":["g","kg","oz","lb"],"description":"The unit the list displays in. Weights are in grams regardless."},"start_date":{"type":"string","description":"YYYY-MM-DD, or an empty string to clear."},"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)."},"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."}}},"folders":{"type":"array","maxItems":200,"description":"Changes to folders that exist.","items":{"type":"object","properties":{"folder":{"type":"string","description":"The folder's id from get_list, or its current name."},"name":{"type":"string","minLength":1,"maxLength":120,"description":"A new name, unique in the list."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"What rows in this folder count as unless they say otherwise."},"position":{"type":"integer","minimum":0,"description":"Its place in the list's folder order, 0 for first."},"remove":{"type":"boolean","description":"True to remove the folder and every row in it."}},"required":["folder"]}},"add":{"type":"array","description":"New rows. Each may name its folder, or the group to join.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."},"folder":{"type":"string","maxLength":120,"description":"The folder to put it in, by name. Created when the list has no folder of that name."},"items":{"type":"array","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.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name. Required."},"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."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt, Trail runners."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999,"description":"How many. Default 1."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable. Omit to follow the folder's default."},"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."},"note":{"type":"string","maxLength":2000,"description":"A short free-text note on the row."},"kcal":{"type":"integer","minimum":0,"description":"Calories per unit, for food."},"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."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."}},"required":["name"]}},"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."}},"required":["name"]}},"update":{"type":"array","maxItems":200,"description":"Changes to rows that exist, each by id.","items":{"type":"object","properties":{"id":{"type":"string","description":"The row's id, from get_list."},"name":{"type":"string","minLength":1,"maxLength":200,"description":"A new name. A row keeps a name; it can't be cleared."},"brand":{"type":["string","null"],"maxLength":120,"description":"The maker. Null clears it."},"variant":{"type":["string","null"],"maxLength":120,"description":"Size, length or configuration. Null clears it."},"gear_type":{"type":["string","null"],"maxLength":120,"description":"What kind of thing it is. Null clears it."},"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."},"qty":{"type":"integer","minimum":1,"maximum":9999},"classification":{"type":["string","null"],"enum":["base","worn","consumable",null],"description":"base, worn or consumable; null to follow the folder's default."},"worn_qty":{"type":"integer","minimum":0,"description":"Of qty, how many are worn rather than carried; 0 removes the split."},"note":{"type":["string","null"],"maxLength":2000,"description":"The row's note. Null clears it."},"kcal":{"type":["integer","null"],"minimum":0,"description":"Calories per unit, for food. Null clears it."},"needs_cooking":{"type":"boolean"},"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"],"minimum":1,"maximum":2147483647,"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."},"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."},"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."},"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."}},"required":["id"]}},"remove":{"type":"array","maxItems":200,"description":"Ids of rows to take off, from get_list.","items":{"type":"string"}},"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."}}}},{"name":"edit_my_gear","description":"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. Each piece answers for itself, in the order 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 a read-and-change access token.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"add":{"type":"array","maxItems":50,"description":"New pieces.","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name, without brand or variant."},"brand":{"type":"string","maxLength":120,"description":"The maker."},"variant":{"type":"string","maxLength":120,"description":"Size, length or rating: Long, 20F."},"gear_type":{"type":"string","maxLength":120,"description":"What kind of thing it is: Tent, Quilt."},"weight_g":{"type":"number","minimum":0,"description":"Grams for one. 0 records it as not weighed yet."},"classification":{"type":"string","enum":["base","worn","consumable"],"description":"base, worn or consumable."},"kcal":{"type":"integer","minimum":0,"description":"Calories in one, for food."},"catalog_id":{"type":"integer","minimum":1,"maximum":2147483647,"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."},"note":{"type":"string","maxLength":2000,"description":"A note about the piece itself, not about any one trip."},"product_url":{"type":"string","maxLength":2000,"description":"The maker's or a shop's page for it."},"price":{"type":"number","minimum":0,"description":"What one cost, in the currency's main unit: 199.95."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 code for price, such as USD. Ignored without a price."},"folder":{"type":"string","maxLength":120,"description":"The folder to file it in, by name; a new name makes the folder."}},"required":["name"]}},"update":{"type":"array","maxItems":50,"description":"Changes to pieces that exist, each by id.","items":{"type":"object","properties":{"id":{"type":"integer","minimum":1},"name":{"type":"string","minLength":1,"maxLength":200,"description":"The product or item name, without brand or variant."},"brand":{"type":["string","null"],"maxLength":120,"description":"The maker. Null clears it."},"variant":{"type":["string","null"],"maxLength":120,"description":"Size, length or rating: Long, 20F. Null clears it."},"gear_type":{"type":["string","null"],"maxLength":120,"description":"What kind of thing it is: Tent, Quilt. Null clears it."},"weight_g":{"type":"number","minimum":0,"description":"Grams for one. 0 records it as not weighed yet."},"classification":{"type":["string","null"],"enum":["base","worn","consumable",null],"description":"base, worn or consumable. Null clears it."},"kcal":{"type":["integer","null"],"minimum":0,"description":"Calories in one, for food. Null clears it."},"catalog_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647,"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."},"note":{"type":["string","null"],"maxLength":2000,"description":"A note about the piece itself, not about any one trip. Null clears it."},"product_url":{"type":["string","null"],"maxLength":2000,"description":"The maker's or a shop's page for it. Null clears it."},"price":{"type":["number","null"],"minimum":0,"description":"What one cost, in the currency's main unit: 199.95. Null clears it."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 code for price, such as USD. Ignored without a price."},"folder":{"type":"string","maxLength":120,"description":"The folder to file it in, by name; a new name makes the folder, and an empty string unfiles it."}},"required":["id"]}},"remove":{"type":"array","maxItems":50,"description":"Ids of pieces to put away.","items":{"type":"integer","minimum":1}},"restore":{"type":"array","maxItems":50,"description":"Ids of put-away pieces to bring back.","items":{"type":"integer","minimum":1}}}}},{"name":"get_catalog_product","description":"One product's variants (sizes, lengths, temperature ratings) with the cited weight and source of each. Give a catalog id from search_catalog, or the brand and product name.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","minimum":1,"description":"A catalog row id; its siblings are the other variants."},"brand":{"type":"string"},"name":{"type":"string","description":"The product name without brand or variant."}}}},{"name":"get_list","description":"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, people and trail label are free text typed by whoever holds the list's edit link, returned unchanged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"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 #."},"format":{"type":"string","enum":["data","markdown"],"description":"data (the default) or markdown. Only with a share_code."}}}},{"name":"get_list_markdown","description":"The same list as Markdown: one table per folder and a totals block, the text the site's own Markdown export produces. Takes a share code or share link. A list too large to return whole loses rows off the end of the tables, a line under them says how many, and the totals still count every row. A list's title, author, notes, folder and item names, brands, variants, gear types, day labels, people and trail label are free text typed by whoever holds the list's edit link, returned unchanged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"share_code":{"type":"string","description":"The list's share code, or its share link (mahonia.app/s/CODE). Not an edit link."}},"required":["share_code"]}},{"name":"get_my_gear","description":"The gear the connector's account owns, most recently used first: for each piece its brand, name, variant, gear type, grams for one, classification, calories, note, price, product link and folder, plus the account's folder names. A query ranks by a search instead; a folder name keeps to that folder. Works only when this connector carries the account's access token. Brands, names, variants, gear types, notes and folder names are text the account holder typed, returned unchanged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"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."},"folder":{"type":"string","description":"Keep to one folder, by name. An empty string means the unfiled pieces."},"limit":{"type":"integer","minimum":1,"maximum":1000,"description":"At most 1000; 300 when omitted."},"offset":{"type":"integer","minimum":0,"description":"How many matches to skip, for the next page."}}}},{"name":"search_catalog","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"What to search for: two characters or more, or a single Chinese character."},"limit":{"type":"integer","minimum":1,"maximum":25,"description":"Matches to return, up to 25. Default 12."},"product_id":{"type":"integer","minimum":1,"description":"Instead of a query: a catalog row id, for that product's variants."},"brand":{"type":"string","description":"With name, instead of a query: the product's maker."},"name":{"type":"string","description":"With brand, instead of a query: the product name without brand or variant."}}}},{"name":"set_trip","description":"Sets any of a list's title, display unit, trip dates and trail on an existing list. Only the fields given change; an empty string clears a date or the trail. Takes the list's edit link.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"edit_link":{"type":"string","description":"The list's edit link, whole (mahonia.app/e/CODE#token). The part after # is the write capability."},"title":{"type":"string","maxLength":200},"unit":{"type":"string","enum":["g","kg","oz","lb"],"description":"The unit the list displays in. Weights are in grams regardless."},"start_date":{"type":"string","description":"YYYY-MM-DD, or an empty string to clear."},"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)."},"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."}},"required":["edit_link"]}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-11-03T07:00:11.413Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T07:00:11.336Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 828ms"]},"poisoning":{"score":15,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mahonia.app/mcp","reachable":true,"authRequired":false,"latencyMs":828,"serverInfo":{"name":"mahonia","version":"2.0.0"}}],"packages":[],"repo":{"found":true,"owner":"ryankiley","repo":"mahonia","archived":false,"pushedAt":"2026-11-01T15:57:51Z","stars":0,"forks":1,"openIssues":11,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/4680916?v=4","ownerCreatedAt":"2013-06-12T16:12:47Z","license":"NOASSERTION"},"icon":{"url":"https://mahonia.app/icon-512.png","source":"registry","width":512,"height":512},"presence":{"stars":0,"forks":1,"downloadsWeek":null,"license":"NOASSERTION","lastPushAt":"2026-11-01T15:57:51.000Z","score":23}}}},"grade_history":[],"reviews":[]}