Personal AI manufacturing. Make your three wishes; Unfactory makes them and brings them to you.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Save up to ten wishes to the person's wish list: their list of ten (source "list"), things they ask for (source "added"), or something you noticed and they agreed to (source "ai_suggested"). Use makeable_id when a design fits; leave it out for physical things Unfactory can't make yet. Wild dreams go in lane "someday" with the closest thing makeable today. Only add what the person has agreed to.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http unfactory https://mjpgeswvvidgjfocnyaa.supabase.co/functions/v1/mcp
Save up to ten wishes to the person's wish list: their list of ten (source "list"), things they ask for (source "added"), or something you noticed and they agreed to (source "ai_suggested"). Use makeable_id when a design fits; leave it out for physical things Unfactory can't make yet. Wild dreams go in lane "someday" with the closest thing makeable today. Only add what the person has agreed to.
| Argument | Type | Description |
|---|---|---|
| source | string | |
| wishes* | array | |
| wish_token* | string |
{
"type": "object",
"required": [
"wish_token",
"wishes"
],
"properties": {
"source": {
"enum": [
"list",
"added",
"ai_suggested"
],
"type": "string"
},
"wishes": {
"type": "array",
"items": {
"type": "object",
"required": [
"request"
],
"properties": {
"idea": {
"type": "string",
"description": "How you'd shape it for them"
},
"lane": {
"enum": [
"wish",
"someday"
],
"type": "string",
"description": "someday for wild dreams"
},
"request": {
"type": "string",
"description": "The wish in plain words"
},
"makeable_id": {
"type": "string",
"description": "Design from find_makeables, if one fits"
},
"closest_idea": {
"type": "string",
"description": "Someday: what that closest thing would be"
},
"closest_makeable_id": {
"type": "string",
"description": "Someday: design for the closest thing makeable today, e.g. dream-miniature"
}
}
},
"maxItems": 10,
"minItems": 1
},
"wish_token": {
"type": "string"
}
}
}Cancel an order before making starts. Needs the order id and the phone number it was placed with. Only do this if the person asks.
| Argument | Type | Description |
|---|---|---|
| phone* | string | |
| order_id* | string |
{
"type": "object",
"required": [
"order_id",
"phone"
],
"properties": {
"phone": {
"type": "string"
},
"order_id": {
"type": "string"
}
}
}Confirm an order using the 6-digit code the person received. Use exactly the code they give you.
| Argument | Type | Description |
|---|---|---|
| code* | string | |
| order_id* | string |
{
"type": "object",
"required": [
"order_id",
"code"
],
"properties": {
"code": {
"type": "string",
"pattern": "^\\d{6}$"
},
"order_id": {
"type": "string"
}
}
}Search what Unfactory can make, from a plain description of what the person wants (e.g. 'something to hold my phone while I cook'). Returns matching items with sizes, colours, prices and making time.
| Argument | Type | Description |
|---|---|---|
| request* | string | What the person wants, in their words. |
{
"type": "object",
"required": [
"request"
],
"properties": {
"request": {
"type": "string",
"description": "What the person wants, in their words."
}
}
}Price one item with chosen options, delivered to a Nigerian state. Returns a quote_id valid for 24 hours, the total in naira (including delivery) and the arrival day. Show this to the person before ordering.
| Argument | Type | Description |
|---|---|---|
| size | string | One of the item's sizes. Defaults to the first. |
| colour | string | One of the item's colours. Defaults to the first. |
| quantity | integer | |
| makeable_id* | string | id from find_makeables |
| delivery_state* | string | |
| personalisation | string | Custom text, if the item allows it. |
{
"type": "object",
"required": [
"makeable_id",
"delivery_state"
],
"properties": {
"size": {
"type": "string",
"description": "One of the item's sizes. Defaults to the first."
},
"colour": {
"type": "string",
"description": "One of the item's colours. Defaults to the first."
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 50,
"minimum": 1
},
"makeable_id": {
"type": "string",
"description": "id from find_makeables"
},
"delivery_state": {
"enum": [
"Abia",
"Adamawa",
"Akwa Ibom",
"Anambra",
"Bauchi",
"Bayelsa",
"Benue",
"Borno",
"Cross River",
"Delta",
"Ebonyi",
"Edo",
"Ekiti",
"Enugu",
"FCT",
"Gombe",
"Imo",
"Jigawa",
"Kaduna",
"Kano",
"Katsina",
"Kebbi",
"Kogi",
"Kwara",
"Lagos",
"Nasarawa",
"Niger",
"Ogun",
"Ondo",
"Osun",
"Oyo",
"Plateau",
"Rivers",
"Sokoto",
"Taraba",
"Yobe",
"Zamfara"
],
"type": "string"
},
"personalisation": {
"type": "string",
"description": "Custom text, if the item allows it."
}
}
}Save one of the person's three founding wishes. slot 1: made for them by you, sealed; it can be from their list of ten or something else (needs reason). slot 2: for someone they love (needs recipient_name, recipient_phone, recipient_city, giver_name, recipient_note). slot 3: their own pick. Start from a makeable_id from find_makeables and describe what you made in idea. Returns their price (discount depends on when they joined), paid only when it's made.
| Argument | Type | Description |
|---|---|---|
| idea* | string | One or two sentences: what you made and how it's shaped for this person |
| size | string | |
| slot* | integer | |
| colour | string | |
| reason | string | Slot 1: the one line printed on the card, pointing to something real about them |
| giver_name | string | Slot 2: how the person wants to be named on the card |
| wish_token* | string | |
| gift_reveal | string | Slot 2: tell the recipient now that something is coming, or keep it a complete surprise until it's ready |
The things Unfactory members wish for most, and whether they can be made yet. Wishes many people share get made first.
No arguments.
{
"type": "object",
"properties": {}
}Shows their founding wishes (wish one stays sealed), their wish list, their discounts, place in line, friends who joined and invite link.
| Argument | Type | Description |
|---|---|---|
| wish_token* | string |
{
"type": "object",
"required": [
"wish_token"
],
"properties": {
"wish_token": {
"type": "string"
}
}
}Only call after the person has seen the quote and said yes. Creates the order and sends a 6-digit code to their phone by WhatsApp or SMS. Then ask them for the code and call confirm_order.
| Argument | Type | Description |
|---|---|---|
| city* | string | |
| phone* | string | Their phone number. Nigerian numbers can be local (0803 000 0000); others need the country code (+44...) |
| address* | string | Street address, house number, area |
| landmark | string | Optional nearby landmark to help delivery |
| quote_id* | string | |
| recipient_name* | string |
{
"type": "object",
"required": [
"quote_id",
"phone",
"recipient_name",
"address",
"city"
],
"properties": {
"city": {
"type": "string"
},
"phone": {
"type": "string",
"description": "Their phone number. Nigerian numbers can be local (0803 000 0000); others need the country code (+44...)"
},
"address": {
"type": "string",
"description": "Street address, house number, area"
},
"landmark": {
"type": "string",
"description": "Optional nearby landmark to help delivery"
},
"quote_id": {
"type": "string"
},
"recipient_name": {
"type": "string"
}
}
}Begin a founding member's wishes. Sends a 6-digit code to their phone (any country; country code needed outside Nigeria). Then ask them for it and call verify_wisher.
| Argument | Type | Description |
|---|---|---|
| phone* | string |
{
"type": "object",
"required": [
"phone"
],
"properties": {
"phone": {
"type": "string"
}
}
}Get the status and history of an order. Needs the order id and the phone number it was placed with.
| Argument | Type | Description |
|---|---|---|
| phone* | string | |
| order_id* | string |
{
"type": "object",
"required": [
"order_id",
"phone"
],
"properties": {
"phone": {
"type": "string"
},
"order_id": {
"type": "string"
}
}
}Check the code the person received. Returns a wish_token for make_wish and my_wishes, their founding number, which wishes they have, their place in line and their invite link. Use exactly the code they give you. If someone invited them, pass that invite code.
| Argument | Type | Description |
|---|---|---|
| code* | string | |
| phone* | string | |
| invite_code | string |
{
"type": "object",
"required": [
"phone",
"code"
],
"properties": {
"code": {
"type": "string",
"pattern": "^\\d{6}$"
},
"phone": {
"type": "string"
},
"invite_code": {
"type": "string"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
| makeable_id* |
| string |
| Starting design from find_makeables |
| recipient_city | string | Slot 2 |
| recipient_name | string | Slot 2: first name |
| recipient_note | string | Slot 2: short note for the card |
| personalisation | string | Words on it, if the design allows |
| recipient_phone | string | Slot 2: their phone number (country code if outside Nigeria) |
| finishing_detail | string | Slot 1, only if needed: one short question Unfactory will ask them before making, that doesn't reveal the item (e.g. 'What phone do you use?'). Required when the design's fits_anyone is false. |
{
"type": "object",
"required": [
"wish_token",
"slot",
"makeable_id",
"idea"
],
"properties": {
"idea": {
"type": "string",
"description": "One or two sentences: what you made and how it's shaped for this person"
},
"size": {
"type": "string"
},
"slot": {
"enum": [
1,
2,
3
],
"type": "integer"
},
"colour": {
"type": "string"
},
"reason": {
"type": "string",
"description": "Slot 1: the one line printed on the card, pointing to something real about them"
},
"giver_name": {
"type": "string",
"description": "Slot 2: how the person wants to be named on the card"
},
"wish_token": {
"type": "string"
},
"gift_reveal": {
"enum": [
"now",
"on_delivery"
],
"type": "string",
"description": "Slot 2: tell the recipient now that something is coming, or keep it a complete surprise until it's ready"
},
"makeable_id": {
"type": "string",
"description": "Starting design from find_makeables"
},
"recipient_city": {
"type": "string",
"description": "Slot 2"
},
"recipient_name": {
"type": "string",
"description": "Slot 2: first name"
},
"recipient_note": {
"type": "string",
"description": "Slot 2: short note for the card"
},
"personalisation": {
"type": "string",
"description": "Words on it, if the design allows"
},
"recipient_phone": {
"type": "string",
"description": "Slot 2: their phone number (country code if outside Nigeria)"
},
"finishing_detail": {
"type": "string",
"description": "Slot 1, only if needed: one short question Unfactory will ask them before making, that doesn't reveal the item (e.g. 'What phone do you use?'). Required when the design's fits_anyone is false."
}
}
}