Runs a Secret Santa name draw in chat and gives each person a private reveal link.
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.
The rules and fairness answers pickmysecretsanta.com itself publishes, worded the site's way. Topics: basics (the classic rules), fairness_and_secrecy (how the sealed draw works and its honest limits), organizer_view (the organizer sees names and links, never matches), keep_apart_pairs, late_joiner (the two honest ways to add someone after the draw), budget (the four bands), white_elephant (how it differs).
Which rule to explain.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http pick-my-secret-santa https://mcp.pickmysecretsanta.com/mcp
The rules and fairness answers pickmysecretsanta.com itself publishes, worded the site's way. Topics: basics (the classic rules), fairness_and_secrecy (how the sealed draw works and its honest limits), organizer_view (the organizer sees names and links, never matches), keep_apart_pairs, late_joiner (the two honest ways to add someone after the draw), budget (the four bands), white_elephant (how it differs).
| Argument | Type | Description |
|---|---|---|
| topic* | string | Which rule to explain. |
{
"type": "object",
"required": [
"topic"
],
"properties": {
"topic": {
"enum": [
"basics",
"fairness_and_secrecy",
"organizer_view",
"keep_apart_pairs",
"late_joiner",
"budget",
"white_elephant"
],
"type": "string",
"description": "Which rule to explain."
}
}
}Filters Santa's vetted 212 hand-checked gift ideas - the Secret Santa subset of the shared 255-idea bank it shares with its sister site The Present Picker, sorted here for Secret Santa by the budget band your group agreed for its draw - with strict parameters, and returns up to three picks. Parameters: budget_band (required: under_25, 25_to_50, 50_to_100, over_100); recipient_type (anyone, kid - only ideas from the bank's Kid shelf, or adult - everything except the Kid shelf); one interest hint (books, cooking, cozy, fitness, games, gardening, music, outdoors, science, tech, travel, or surprise) which ranks matches first; and avoid, a list of words - any idea whose name, blurb, or why mentions an avoid word is excluded, and the answer says how many ideas the filters set aside. Each pick names the kind of gift, why it fits, and what to look for and avoid. No brands, no stores, no exact prices: budget bands are guides, not exact prices. This tool never asks who the gift is for by name and knows nothing about any draw.
| Argument | Type | Description |
|---|---|---|
| avoid | array | Words to exclude: any idea whose name, blurb, or why mentions one of these words is filtered out (for example "coffee" or "scented"). |
| budget | string | Legacy alias for budget_band. |
| interest | string | One interest hint for the person, or surprise for any. |
| budget_band | string | The group's budget band. |
| recipient_type | string | Who the gift is for: kid returns only the bank's Kid-shelf ideas; adult excludes them; anyone (default) applies no recipient filter. |
{
"type": "object",
"required": [],
"properties": {
"avoid": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Words to exclude: any idea whose name, blurb, or why mentions one of these words is filtered out (for example \"coffee\" or \"scented\")."
},
"budget": {
"enum": [
"under_25",
"25_to_50",
"50_to_100",
"over_100"
],
"type": "string",
"description": "Legacy alias for budget_band."
},
"interest": {
"enum": [
"books",
"cooking",
"cozy",
"fitness",
"games",
"gardening",
"music",
"outdoors",
"science",
"tech",
"travel",
"surprise"
],
"type": "string",
"description": "One interest hint for the person, or surprise for any."
},
"budget_band": {
"enum": [
"under_25",
"25_to_50",
"50_to_100",
"over_100"
],
"type": "string",
"description": "The group's budget band."
},
"recipient_type": {
"enum": [
"anyone",
"kid",
"adult"
],
"type": "string",
"description": "Who the gift is for: kid returns only the bank's Kid-shelf ideas; adult excludes them; anyone (default) applies no recipient filter."
}
}
}Configures a Secret Santa group of 3 to 30 right here in chat and hands the organizer one pre-filled link to pickmysecretsanta.com, where the zero-knowledge draw runs in their browser - no server sees the matches, and each match will live inside one private link - hidden from plain sight, not locked. Give it the group's names and, optionally, a group name, a budget band, and keep_apart pairs (two-name lists, like [["Ana", "Ben"]], for people who must not draw each other): it validates the setup (3 to 30 people, no shared names - the site's draw cannot tell two same-named people apart) and checks that a valid draw exists under the keep-apart pairs before it returns the link with the group, names, budget, and pairs already in the form, plus the site's honest warnings; if the pairs leave no fair draw, it names the conflict plainly and returns no link. The link carries setup only - nobody has been assigned anyone. Names are used once to build the link and are never stored. With only a headcount (group_size) and no names, it instead returns the setup checklist the site prescribes: what to agree out loud first (buy-by date, what counts as a gift, the late-joiner rule, the reveal), the budget step, and how the browser draw works.
| Argument | Type | Description |
|---|---|---|
| names | array | Every player's name, one per person (3 to 30). Names must be distinct - add a last initial where two people share a name. When names are given, the tool returns the pre-filled setup link. |
| budget | string | Legacy alias for budget_band. |
| group_name | string | Optional group name, up to 40 characters (for example "The Office Crew"). |
| group_size | integer | How many people, 3 to 30 - for the checklist when no names are given. |
| keep_apart | array | Pairs who must not draw each other, as two-name lists using names from the names list, e.g. [["Ana", "Ben"]]. |
| budget_band | string | The group's budget band, if already picked. |
| has_keep_apart_pairs | boolean | Checklist mode only: true if some pairs must not draw each other. |
{
"type": "object",
"required": [],
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 30,
"minItems": 3,
"description": "Every player's name, one per person (3 to 30). Names must be distinct - add a last initial where two people share a name. When names are given, the tool returns the pre-filled setup link."
},
"budget": {
"enum": [
"under_25",
"25_to_50",
"50_to_100",
"over_100"
],
"type": "string",
"description": "Legacy alias for budget_band."
},
"group_name": {
"type": "string",
"description": "Optional group name, up to 40 characters (for example \"The Office Crew\")."
},
"group_size": {
"type": "integer",
"maximum": 30,
"minimum": 3,
"description": "How many people, 3 to 30 - for the checklist when no names are given."
},
"keep_apart": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 2,
"minItems": 2
},
"description": "Pairs who must not draw each other, as two-name lists using names from the names list, e.g. [[\"Ana\", \"Ben\"]]."
},
"budget_band": {
"enum": [
"under_25",
"25_to_50",
"50_to_100",
"over_100"
],
"type": "string",
"description": "The group's budget band, if already picked."
},
"has_keep_apart_pairs": {
"type": "boolean",
"description": "Checklist mode only: true if some pairs must not draw each other."
}
}
}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 5, 2026.