{"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":80,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-19T17:53:23.000Z","license":"NOASSERTION"},"uptime":{"percent":100,"checks":7,"ok":7,"last_checked_at":"2026-09-21T01:30:32.329Z","last_ok_at":"2026-09-21T01:30:32.329Z","latency_ms":409},"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. Keep the edit link: it is the only way back into the list.","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."}},"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."}},"required":["name"]}}}}},{"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 as data: 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 nested row without carried_by is carried by its parent's carrier). Takes a share code or share link. A list too large to return whole comes back cut and says so in a truncated field: notes go first, then rows off the end (nested rows one by one), 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_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":"search_catalog","description":"Fuzzy search of Mahonia's cited gear catalog by brand, product or kind of gear (\"duplex\", \"zpacks\", \"quilt\"). Each result carries a catalog id, the cited weight in grams and whether it is verified. Use get_catalog_product for every variant of one product.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Two characters or more."},"limit":{"type":"integer","minimum":1,"maximum":25,"description":"Up to 25. Default 12."}},"required":["query"]}},{"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":80,"grade":"B","scanned_at":"2026-09-19T19:10:25.289Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:10:25.307Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 322ms"]},"poisoning":{"score":15,"max":15,"notes":["7 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 0 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"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":322,"serverInfo":{"name":"mahonia","version":"1.0.0"}}],"packages":[],"repo":{"found":true,"owner":"ryankiley","repo":"mahonia","archived":false,"pushedAt":"2026-09-19T17:53:23Z","stars":0,"forks":0,"openIssues":18,"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":0,"downloadsWeek":null,"license":"NOASSERTION","lastPushAt":"2026-09-19T17:53:23.000Z","score":23}}}},"grade_history":[],"reviews":[]}