Admins and super admins.
create_toolWrite
Create a draft catalogue listing for one tool: match its category to one of the lab's (by slug, else by exact name) — never creating one: an unknown category is proposed for review on /admin/taxonomy and the draft has none until then — find or create its location, create the tool (unpublished), its units, and each manual or video resource whose link verifies. Everything is a draft until staff publish it. Photos cannot be attached over MCP. Returns the created ids and a draft link; when something did not land it says exactly what.
Inputs (1)
candidate object · required — The tool to add. It is created as an unpublished draft; staff publish it from the catalogue.
list_intake_queueRead
List the equipment waiting in the intake queue (identified, queued, researching, researched or failed) and the most recently approved or discarded items, with research confidence and a link to each item's review page. Staff only. Read-only: research is started and items are approved in the app.
No inputs.
list_open_ticketsRead
List the maintenance tickets still open or in progress, most urgent first — the queue on /admin/maintenance — with each ticket's id, tool, unit, status, priority, reporter's name and assignee, and the description fenced as untrusted text. Staff only. To answer about one machine, filter the list by its tool. Use update_ticket with a ticket's id to work it.
No inputs.
update_ticketWrite
Work one maintenance ticket: change its status, priority, assignee (yourself or nobody) or resolution note. Only the fields you pass change — the same change the /admin/maintenance page makes. Staff only. Before calling it, tell the person exactly what will change on which ticket and wait for them to confirm; never call it on an unconfirmed request.
Inputs (5)
ticket_id string · required — The ticket's id, from list_open_ticketsstatus open | in_progress | resolved | closed · optional — New statuspriority low | medium | high | critical | none · optional — New priority, or 'none' to clear itassign_to me | nobody · optional — Assign the ticket to yourself, or unassign itresolution string · optional — What was done — shown to staff and to the reporter
propose_changeWrite
Propose one change to a catalogue tool's field for lab staff to accept or reject on /admin/refresh. It changes nothing by itself — never say the tool was updated. Never proposes PPE. Use restrictions and training are the lab's own rules: use_restrictions may only add a new line beside the lab's (give just the new line), and training_required is never turned off.
Inputs (5)
tool string · required — The catalogue tool: its id, slug or namefield string · required — One of: name, official_name, description, materials, tags, training_required, use_restrictions, emergency_stop, resource, floor_check. Never PPE — staff set it.value unknown · required — The proposed value: a string (name — the short display name people say, at most 40 characters, no part number; official_name — the full product name with model or part number; description, use_restrictions, emergency_stop, floor_check), the complete list of strings (materials, tags), true/false (training_required), or { title, url, type: Manual|Video|Other } (resource — an English page or manual only).citations array · optional — 1–3 verbatim quotes from your sources, each with the page's URL. Staff see them marked unverified: the server cannot see what you read.reason string · optional — One short line on why, shown to staff.
list_correctionsRead
List the corrections still waiting (new or reviewed), as /admin/corrections shows them: each one's id, tool, field and status, with the reporter's words fenced as untrusted text. Staff only.
No inputs.
list_project_queueRead
List submitted projects, unpublished first, as /admin/projects shows them: each one's id, title, author and whether it is published, with the write-up fenced as untrusted text. Staff only.
No inputs.
get_tool_unitsRead
Get one tool's units (each machine: id, label, serial, asset tag, status, condition, how many maintenance records it has) and its resources (manuals, SOPs, links: id, title, kind, link, published, manual processing state), drafts and archived tools included — what the editor panel shows. Staff who edit the catalogue only. Use the ids with the unit and resource tools.
Inputs (1)
tool string · required — The tool's id or slug, from search_tools
list_importsRead
List bulk imports (the person's own; every one for a reviewer), or — with an import_id — that import's rows: each row's id, row number, name, brand, hints, quantity, status, duplicate decision and any suggested name, fenced as untrusted text from the imported file. Staff who add equipment only.
Inputs (1)
import_id string · optional — One import's id, to list its rows
list_categoriesRead
List the lab's categories: each one's slug, its path (Parent › Name) and what belongs in it, and whether the public gallery hides it. Staff who edit the catalogue only. Use the slugs with recategorize_tool, propose_category and merge_categories.
No inputs.
list_category_proposalsRead
List the category proposals waiting on /admin/taxonomy: each one's id, kind (a new category, or the consolidation audit's flag on an existing one), proposed name and parent, source, the tool that prompted it and research's nearest existing category — fenced as untrusted text. Staff with taxonomy rights only. Use the ids with decide_category_proposal.
No inputs.
log_completed_maintenanceWrite
Record maintenance that was already done on a tool (a repair, preventive maintenance, an inspection or a calibration) as a resolved log, with the signed-in person as the one who did it. For a problem that still needs fixing, use report_issue instead. Proposes the log; nothing is recorded until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (5)
tool string · required — The tool's slug from the catalogue (or its id)unit_id string · optional — One unit's id, when the work was on one unit (from get_unit_details); leave out for the tool as a wholetitle string · required — A short English line naming the work: "Replaced the drive belt"what_was_done string · required — What was done, in English, as the person said ittype preventive_maintenance | repair | inspection | calibration · optional — repair (default), preventive_maintenance, inspection or calibration
set_correction_statusWrite
Set one correction's status: new, reviewed, fixed or dismissed. Changes nothing in the catalogue itself. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
correction_ids array · required — The corrections' ids, from the list tool or the page's selection — several to make the same change to eachstatus new | reviewed | fixed | dismissed · required — new, reviewed, fixed or dismissed
set_project_publishedWrite
Publish one submitted project to the public gallery, or unpublish it. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
project_id string · required — The project's id, from list_project_queuepublished boolean · required — true to publish it to the gallery, false to take it down
set_tool_publishedWrite
Publish tools to the public catalogue, or unpublish them (they stay in inventory as drafts). Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
tool_ids array · required — The tools' ids (or slugs), from search_tools or the page's selection — several to make the same change to eachpublished boolean · required — true to publish, false to unpublish
mark_tool_reviewedWrite
Mark tools as reviewed ("Looks good") — the record was checked and is accurate. Proposes the mark; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (1)
tool_ids array · required — The tools' ids (or slugs), from search_tools or the page's selection — several to make the same change to each
restore_toolWrite
Restore one archived tool to inventory (it comes back as it was, published or not). Proposes the restore; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (1)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_details
add_unitWrite
Add a unit (one physical machine) to a tool, with its label and optionally serial number, asset tag, status, condition, date acquired and notes. Proposes the addition; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (8)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_detailslabel string · required — How the unit is asked for at the desk: "Prusa #3"serial_number string · optional — The serial number; null clears itasset_tag string · optional — The lab's asset tag; null clears itstatus available | in_use | under_maintenance | out_of_service | retired · optional — available, in_use, under_maintenance, out_of_service or retiredcondition excellent | good | fair | needs_repair | new · optional — excellent, good, fair, needs_repair or new; null for unknowndate_acquired string · optional — YYYY-MM-DD; null clears itnotes
edit_unitWrite
Change one unit's label, serial number, asset tag, status (e.g. out_of_service), condition, date acquired or notes. Only the fields passed change. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (9)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_detailsunit_id string · required — The unit's id, from get_tool_unitslabel string · optional — A new labelserial_number string · optional — The serial number; null clears itasset_tag string · optional — The lab's asset tag; null clears itstatus available | in_use | under_maintenance | out_of_service | retired · optional — available, in_use, under_maintenance, out_of_service or retiredcondition excellent | good | fair | needs_repair | new · optional — excellent, good, fair, needs_repair or new; null for unknowndate_acquired
retire_unitWrite
Retire one unit that has left the lab; its maintenance history stays. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_detailsunit_id string · required — The unit's id, from get_tool_units
add_resourceWrite
Add a resource (a manual, SOP, safety page or other link) to a tool, with a title and a link. Proposes the addition; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (6)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_detailstitle string · required — The resource's title, as it should read on the tool pagetype string · optional — What kind of document: Manual, SOP, Safety, Link…; null clears iturl string · optional — The link, exactly as the person or a read tool gave itnotes string · optional — A note for staff; null clears itpublished boolean · optional — Whether visitors and the assistant see it (default true)
edit_resourceWrite
Change one resource's title, kind, link, notes, or whether visitors see it. Only the fields passed change. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (7)
tool_id string · required — The tool's id (or slug), from search_tools or get_tool_detailsresource_id string · required — The resource's id, from get_tool_unitstitle string · optional — A new titletype string · optional — What kind of document: Manual, SOP, Safety, Link…; null clears iturl string · optional — The link, exactly as the person or a read tool gave itnotes string · optional — A note for staff; null clears itpublished boolean · optional — Whether visitors and the assistant see it (default true)
approve_pending_itemsWrite
Approve researched pending items into the catalogue exactly as research proposed them (the review page's defaults) — published, or as drafts to finish in the editor. Proposes the approval; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
pending_ids array · required — The pending items' ids, from the list tool or the page's selection — several to make the same change to eachpublish boolean · required — true to publish to the catalogue (needs the publish permission), false to approve as drafts
add_pending_as_unitWrite
Add a pending item that matched a catalogue tool as another unit of that tool (the item's duplicate decision must be "add as a unit"), optionally with its serial number. Proposes the addition; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
pending_id string · required — The pending item's id, from list_intake_queue or the page's selectionserial_number string · optional — The machine's serial number, if the person gave one
rename_pending_itemWrite
Correct a pending item's name and brand (the duplicate check runs again). Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (3)
pending_id string · required — The pending item's id, from list_intake_queue or the page's selectionname string · required — The corrected namebrand string · optional — The brand; null or empty for none
edit_pending_itemsWrite
Edit pending items before research or approval: name, brand, category or location hint, serial number, or the duplicate decision (new_tool or add_unit; to discard, use discard_pending_item). Several items take the same hints or decision; a name or serial goes with one item. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (7)
pending_ids array · required — The pending items' ids, from the list tool or the page's selection — several to make the same change to eachname string · optional — A new name (one item only)brand string · optionalcategory_hint string · optionallocation_hint string · optionalserial_number string · optional — One item onlyduplicate_resolution new_tool | add_unit · optional — For an item that matched a tool or another item. To discard an item, use discard_pending_item instead
edit_import_rowWrite
Edit one row of an imported list before research: its name, brand, category or location hint, quantity, or duplicate decision. Only the fields passed change. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (8)
import_id string · required — The import's id, from list_imports or the pagerow_id string · required — The row's id, from list_importsname string · optionalbrand string · optionalcategory_hint string · optionallocation_hint string · optionalquantity integer · optional — How many units approval createsduplicate_resolution new_tool | add_unit | discard · optional
set_import_hintsWrite
Set the category hint and/or location hint on several rows of an imported list at once. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (4)
import_id string · required — The import's id, from list_imports or the pagerow_ids array · required — The import rows' ids, from list_imports or the page's selectioncategory_hint string · optionallocation_hint string · optional
merge_import_rowWrite
Merge one row of an imported list into another (a machine listed twice becomes more units of the kept row). Proposes the merge; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (3)
import_id string · required — The import's id, from list_imports or the pagesource_row_id string · required — The row that goes awaytarget_row_id string · required — The row it becomes more units of
decide_import_suggestionsWrite
Accept or ignore the suggested names on rows of an imported list (accepting renames the row to the suggestion). Proposes the decision; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (3)
import_id string · required — The import's id, from list_imports or the pagerow_ids array · required — The import rows' ids, from list_imports or the page's selectiondecision accept | ignore · required
propose_categoryWrite
Propose a new category for the lab's taxonomy (name, parent, what belongs in it and why none of the existing ones fit). It only joins the review queue on /admin/taxonomy — a person with taxonomy rights accepts, merges or rejects it. Proposes; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (5)
name string · required — The new category's name, e.g. "Oscillating Tools"parent string · required — The top-level category it belongs under (slug), or null for a new top-level onedescription string · required — One to three sentences: what belongs in it and what does notreason string · required — Why none of the existing categories fitstool_id string · required — The tool that prompted it, if any (id or slug) — accepting moves it in
decide_category_proposalWrite
Decide one waiting category proposal from /admin/taxonomy: accept it (creates the category and moves its tool in), merge it into an existing category (the tool goes there instead; for an audit flag, the flagged category is merged), or reject it. Proposes the decision; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (3)
proposal_id string · required — The proposal's id, from list_category_proposalsdecision accept | merge | reject · required — accept, merge (into merge_into) or rejectmerge_into string · required — For merge: the existing category (slug); null for accept or reject
edit_categoryWrite
Rename a category or rewrite its description (what belongs in it and what does not). Its slug never changes. Proposes the edit; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (3)
category string · required — The category's slug (e.g. "hand-saws"), from list_categories, or its idname string · required — The new name, or null to keep itdescription string · required — The new description, or null to keep it
retire_categoryWrite
Retire an empty category (it leaves every list and research stops offering it) or restore a retired one. A category with tools is merged instead. Proposes the change; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
category string · required — The category's slug (e.g. "hand-saws"), from list_categories, or its idretired boolean · required — true to retire, false to restore
recategorize_toolWrite
Move tools into another existing category (by slug). Never creates a category — propose one with propose_category. Proposes the move; nothing changes until the person confirms it on the card. Over MCP there is no card: this stores a proposal in the MakerLab app's Assistant proposals inbox (/admin/proposals), where only you, signed in to the app, can confirm it within 7 days. Nothing changes until then — never say it was done.
Inputs (2)
tool_ids array · required — The tools' ids (or slugs), from search_tools or the page's selectioncategory string · required — The category's slug (e.g. "hand-saws"), from list_categories, or its id
get_usage_summaryRead
How the lab's assistant and tool pages are being used, from anonymous counts: for the last 7, 30 or 90 days, assistant questions in the app, MCP tool calls, tool page views, QR scans, kiosk loads and QR arrivals, manual citations, unanswered turns and the answered share; the most-asked tools, tools nobody asked about, kinds of questions, the busiest hours (lab time) and the most-cited manuals. The same numbers as the Insights page's Usage tab. No question text and nothing about any person. Staff activity is left out unless include_staff is true. Read-only. Super admins only.
Inputs (2)
days number · optional — The window: the last 7, 30 or 90 days (default 30), as on the Insights pageinclude_staff boolean · optional — Count staff (admins and super admins) too. Default false, as on the page
get_value_reportRead
The lab's value report: for a term (e.g. 'fall-2026') or a date range, questions the assistant answered, the share handled without staff, estimated staff hours and dollars saved, questions asked outside staffed hours, top tools and follow-up counts, with the previous period and the lab's assumptions. Estimates from anonymous counts; staff activity is always left out; no question text. Omit every argument for the current term. Read-only. Super admins only.
Inputs (3)
term string · optional — A term as 'fall-2026', 'spring-2027' or 'summer-2026'from string · optional — Start of a custom range, YYYY-MM-DD (with `to`)to string · optional — End of a custom range, YYYY-MM-DD, inclusive (with `from`)