@50heads/mcp 2026.1013.1 → 2026.1013.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/cli.js +3 -3
- package/dist/index.js +3 -3
- package/dist/types/constants.d.ts +2 -2
- package/dist/types/generated/skill.d.ts +1 -1
- package/package.json +4 -4
- package/server.json +3 -3
- package/skills/50heads/SKILL.md +1 -1
- package/skills/50heads.zip +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,15 @@ Pending changes are captured as changesets and written here when the package is
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [2026.1013.2] - 2026-10-13
|
|
12
|
+
|
|
13
|
+
**This release updates the public listing and repository description for 50heads MCP.** It also removes any time promise from the repo description.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **The Glama listing now names 50heads-team as the only maintainer.**
|
|
18
|
+
- **The repository description now carries no time promise.**
|
|
19
|
+
|
|
11
20
|
## [2026.1013.1] - 2026-10-13
|
|
12
21
|
|
|
13
22
|
**@50heads/mcp 2026.1013.1 changes the MCP server to nine action-based tools, with per-action scopes and updated help, status and whoami access.** It also adds filing, organisation, audit, webhook and approval flows, plus JSONL export and clearer privacy wording.
|
|
@@ -91,3 +100,5 @@ Pending changes are captured as changesets and written here when the package is
|
|
|
91
100
|
[2026.1009.1]: https://github.com/50heads/mcp/releases/tag/v2026.1009.1
|
|
92
101
|
|
|
93
102
|
[2026.1013.1]: https://github.com/50heads/mcp/releases/tag/v2026.1013.1
|
|
103
|
+
|
|
104
|
+
[2026.1013.2]: https://github.com/50heads/mcp/releases/tag/v2026.1013.2
|
package/dist/cli.js
CHANGED
|
@@ -10208,11 +10208,11 @@ function fromDraft(d) {
|
|
|
10208
10208
|
}
|
|
10209
10209
|
|
|
10210
10210
|
// src/generated/skill.ts
|
|
10211
|
-
var SKILL_VERSION = "2026.1013.
|
|
10211
|
+
var SKILL_VERSION = "2026.1013.2";
|
|
10212
10212
|
var SKILL_BODY = '# Asking 50heads\n\n50heads puts one short question to verified people and shows what they think.\n\n## When to ask\n\nAsk when the answer is a human reaction: which name, headline, image or menu people prefer, whether copy is clear, what they notice first. Never ask for facts, predictions, advice or research. Check recent `results` (`list`) first.\n\n## Eight rules for a good question\n\n1. One question a head can answer in five seconds.\n2. Ask about a preference or first impression, never a fact.\n3. Show the thing: images (`ab_image`, `upload_image`) for anything visual.\n4. Keep options short, parallel and few: two to four is best. Add Neither when a forced pick would mislead.\n5. Word it neutrally, with no hint of the answer you want.\n6. Put needed background in `context`, one line.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `yes_no` with `go_rule` to approve, `free_text` (Tier 2) for why.\n8. Match heads and tier to the stakes: 50 at Tier 1 for a quick read, 100 or more or Tier 2 for a decision. Target the real audience\'s countries and language.\n\n## How to ask\n\n1. Call `estimate` (`quote`); with a person present, show the price: "50 answers, $12.70." Don\'t promise a time.\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse it to retry.\n3. Wait on the task (older hosts: `results`, `wait`).\n\n## Reading results\n\nLead with the winner, the margin in points and the confidence. With 50 heads a margin under 10 points is noise: say so and suggest more heads. Report underfilled as underfilled. Quote the percentages, not adjectives.\n\nWith a `go_rule`, lead with the `verdict`: go, no go or unclear against the asker\'s line. `head_to_head` says who beats whom; overlapping ranges mean the lead may be chance.\n\n## Worked example\n\n"Which menu would you order from?": two photos, `ab_image`, 50 heads, Tier 1. B 68%, A 32%: "Menu B wins by 36 points. Confidence high."\n\n## Avoid\n\n- Double questions ("Is it clear and friendly?").\n- Personal data, or anything that identifies someone.\n- Re-asking to fish for a different answer.\n\n## Your data\n\nWe don\'t use your questions, the answers you buy or the reasons heads write to train AI models, and we don\'t sell them.\n\nMore: `references/question-types.md`, `pricing.md`, `tools.md`.\n';
|
|
10213
10213
|
var SKILL_FILES = {
|
|
10214
10214
|
"LICENSE": 'MIT License\n\nCopyright (c) 2026 50heads\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n',
|
|
10215
|
-
"SKILL.md": '---\nname: 50heads\ndescription: Ask fifty verified people a five-second question and get a distribution back; use when the work in hand needs a human preference, first impression or sanity check that a model cannot supply.\nlicense: MIT\nmetadata:\n version: "2026.1013.
|
|
10215
|
+
"SKILL.md": '---\nname: 50heads\ndescription: Ask fifty verified people a five-second question and get a distribution back; use when the work in hand needs a human preference, first impression or sanity check that a model cannot supply.\nlicense: MIT\nmetadata:\n version: "2026.1013.2"\n homepage: https://50heads.com/agents\nallowed-tools: "50heads:*"\n---\n\n# Asking 50heads\n\n50heads puts one short question to verified people and shows what they think.\n\n## When to ask\n\nAsk when the answer is a human reaction: which name, headline, image or menu people prefer, whether copy is clear, what they notice first. Never ask for facts, predictions, advice or research. Check recent `results` (`list`) first.\n\n## Eight rules for a good question\n\n1. One question a head can answer in five seconds.\n2. Ask about a preference or first impression, never a fact.\n3. Show the thing: images (`ab_image`, `upload_image`) for anything visual.\n4. Keep options short, parallel and few: two to four is best. Add Neither when a forced pick would mislead.\n5. Word it neutrally, with no hint of the answer you want.\n6. Put needed background in `context`, one line.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `yes_no` with `go_rule` to approve, `free_text` (Tier 2) for why.\n8. Match heads and tier to the stakes: 50 at Tier 1 for a quick read, 100 or more or Tier 2 for a decision. Target the real audience\'s countries and language.\n\n## How to ask\n\n1. Call `estimate` (`quote`); with a person present, show the price: "50 answers, $12.70." Don\'t promise a time.\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse it to retry.\n3. Wait on the task (older hosts: `results`, `wait`).\n\n## Reading results\n\nLead with the winner, the margin in points and the confidence. With 50 heads a margin under 10 points is noise: say so and suggest more heads. Report underfilled as underfilled. Quote the percentages, not adjectives.\n\nWith a `go_rule`, lead with the `verdict`: go, no go or unclear against the asker\'s line. `head_to_head` says who beats whom; overlapping ranges mean the lead may be chance.\n\n## Worked example\n\n"Which menu would you order from?": two photos, `ab_image`, 50 heads, Tier 1. B 68%, A 32%: "Menu B wins by 36 points. Confidence high."\n\n## Avoid\n\n- Double questions ("Is it clear and friendly?").\n- Personal data, or anything that identifies someone.\n- Re-asking to fish for a different answer.\n\n## Your data\n\nWe don\'t use your questions, the answers you buy or the reasons heads write to train AI models, and we don\'t sell them.\n\nMore: `references/question-types.md`, `pricing.md`, `tools.md`.\n',
|
|
10216
10216
|
"references/pricing.md": '# Pricing\n\nPrices are in credits. `estimate` (quote and balance) and 50heads://pricing show them in your account currency at the day\'s rate. You pay per accepted answer; unanswered heads are refunded.\n\nPer answer = tier base \xD7 length \xD7 format, plus images and targeting traits, times 1.5 for rush. Total = per answer \xD7 heads.\n\n| Tier | Heads | Credits an answer | Credits for 50 answers |\n| --- | --- | --- | --- |\n| 1 | phone-verified | 20 | 1000 |\n| 2 | ID-verified | 42 | 2100 |\n| 3 | established heads | 80 | 4000 |\n\nLength (question, context and options together): up to 150 characters \xD7 1.0, up to 300 \xD7 1.1, up to 600 \xD7 1.25.\n\nFormat: `single_choice` \xD7 1.0, `multi_choice` \xD7 1.1, `ab_image` \xD7 1.0, `pairwise` \xD7 1.1, `scale_1_5` \xD7 1.0, `ranking` \xD7 1.3, `yes_no` \xD7 1.0, `yes_mostly_no` \xD7 1.0, `free_text` \xD7 2.0, `click_test` \xD7 1.5, `reaction` \xD7 1.0.\n\nA reason with every answer (`reason`, not for free_text) adds to the format: optional + 0.3, required + 0.6. A required reason on a Tier 1 single choice is 20 \xD7 1.6 = 32 credits an answer. Heads get the same share of the higher price.\n\nImages: 7 credits an answer for each image (audio counts the same). Rush: \xD7 1.5. Five-second test: \xD7 1.3.\n\nTargeting: countries are free. Age, gender and each tag group are one trait each, 3 credits an answer per trait, up to 4, at any tier (PickFu charges about $0.40 per trait). See 50heads://targeting.\n\nHeads: 10 to 5000, default 50.\n\nYour audience (`answered_by: "private"`): a link you share instead of heads, 5 credits an accepted answer, reserved for the most answers the link accepts (`n`, default 100) and refunded for the rest when it closes. No tier, rush, targeting or images surcharge; no time estimate (people answer when you share the link); every result says the answers were not verified by 50heads.\n\nEvery connection has a daily spend cap (default 5,000 credits), set when you connect and editable in the dashboard. Call `balance` to see what is left.\n\nAlways call `estimate` (action quote) first: it returns the exact price, the time and any fixes the question needs, and never spends.\n',
|
|
10217
10217
|
"references/question-types.md": '# Question types\n\nEvery question has `type`, `text` (8 to 600 characters), `language` (such as `en` or `pt-BR`), and optionally `context` (one line, 120 characters), `stimulus` (an image or a line of text shown above the question), `n` (heads, default 50), `tier` (1 to 3, default 1), `rush` and `targeting`.\n\nThe format multiplier is part of the price: per answer = tier base \xD7 length \xD7 format, plus 5 credits an image.\n\nFive-second test: add `exposure_ms` (usually 5000) to an image stimulus on single_choice, multi_choice, yes_no, yes_mostly_no, scale_1_5, reaction or free_text. The app shows the image for that long, hides it, then asks, so the answer is a first impression or what people remember. \xD7 1.3.\nEvery type except `free_text` can ask for a short written reason with each answer: `reason: "optional"` (format + 0.3) or `"required"` (format + 0.6), 10 to 140 characters. Reasons come back on each answer, translated into your language when heads wrote in another, and `results` (action get) summarizes them (themes with counts and quotes, a sentiment split and a takeaway). Use it instead of a follow-up when you want the which and the why from the same heads.\n\n## Single choice (`single_choice`)\n\n- Use: Pick one of several: names, headlines, taglines, colors.\n- Options: 2 to 8 options, 40 characters each; images optional. Two to four reads best.\n- Answer: One option per head; the distribution counts each option.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "single_choice",\n "text": "Which name sounds most like a bakery?",\n "language": "en",\n "options": [\n {\n "label": "Crumb & Co"\n },\n {\n "label": "Loafers"\n },\n {\n "label": "Proof"\n }\n ],\n "n": 50\n}\n```\n\n## Multiple choice (`multi_choice`)\n\n- Use: Tick all that apply: which features matter, which words fit.\n- Options: 2 to 8 options, 40 characters each. Shares add up to more than 100%.\n- Answer: Any number of options per head; each option\'s share is of all heads.\n- Tier: any. Format \xD7 1.1.\n\n```json\n{\n "type": "multi_choice",\n "text": "Which of these would make you try a new coffee shop?",\n "language": "en",\n "options": [\n {\n "label": "Oat milk at no extra cost"\n },\n {\n "label": "Quiet seating"\n },\n {\n "label": "Loyalty card"\n }\n ],\n "n": 50\n}\n```\n\n## A or B image (`ab_image`)\n\n- Use: Two images side by side: menus, logos, screenshots, packaging.\n- Options: Exactly 2 options, each with an image_url (https, or a pre-signed upload). Labels optional.\n- Answer: One image per head.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "ab_image",\n "text": "Which menu would you order from?",\n "language": "en",\n "options": [\n {\n "label": "Menu A",\n "image_url": "https://example.com/menu-a.png"\n },\n {\n "label": "Menu B",\n "image_url": "https://example.com/menu-b.png"\n }\n ],\n "n": 50\n}\n```\n\n## Pairwise (`pairwise`)\n\n- Use: Compare options two at a time when there are too many to show at once.\n- Options: 2 to 8 options; each head sees one pair, balanced so every pair is seen about equally.\n- Answer: One pick per pair. With 3 or more options each row has count (wins), share (win share), a 95% range on it (low, high), appearances, a Bradley\u2013Terry strength and a rank. When the top two ranges overlap, the lead may be chance. head_to_head says who beats whom: share[i][j] is the share of people who put option i above option j.\n- Tier: any. Format \xD7 1.1.\n\n```json\n{\n "type": "pairwise",\n "text": "Which subject line would you open first?",\n "language": "en",\n "options": [\n {\n "label": "Your order is on its way"\n },\n {\n "label": "Good news: it has shipped"\n },\n {\n "label": "Tracking number inside"\n }\n ],\n "n": 100\n}\n```\n\n## Scale 1 to 5 (`scale_1_5`)\n\n- Use: How strongly: clarity, appeal, trust. Report the mean and the split.\n- Options: Fixed: 1, 2, 3, 4, 5. Do not send options.\n- Answer: A number from 1 to 5; results include the mean.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "scale_1_5",\n "text": "How clear is this sentence? 1 is not clear, 5 is very clear.",\n "context": "Your parcel will be left in a safe place if you are out.",\n "language": "en",\n "n": 50\n}\n```\n\n## Ranking (`ranking`)\n\n- Use: Put options in order of preference.\n- Options: 2 to 8 options; keep to five or fewer for a five-second answer.\n- Answer: A full order per head; the distribution carries each option\'s average rank, and head_to_head says who beats whom: share[i][j] is the share of people who put option i above option j.\n- Tier: any. Format \xD7 1.3.\n\n```json\n{\n "type": "ranking",\n "text": "Rank these pizza toppings, favorite first.",\n "language": "en",\n "options": [\n {\n "label": "Mushroom"\n },\n {\n "label": "Pepperoni"\n },\n {\n "label": "Olives"\n },\n {\n "label": "Pineapple"\n }\n ],\n "n": 50\n}\n```\n\n## Yes or no (`yes_no`)\n\n- Use: A binary check. Heads answer Yes or No. This is the yes/no type. For a middle answer, use yes_mostly_no. For an approval-style question, add go_rule to get a go or a no go when Yes clears your line.\n- Options: Fixed: Yes, No. Do not send options.\n- Answer: Yes or No. With go_rule ({ "go_above": 0.6, "min_answers": 40 }), results carry a verdict: go when the whole 95% range on the Yes share is above the line, no_go when it is all at or below it, otherwise unclear (too few answers, or the range crosses the line). The line is fixed once the question is live and costs nothing extra.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "yes_no",\n "text": "Does this button label tell you what will happen?",\n "context": "Button: Save and continue",\n "language": "en",\n "n": 50,\n "go_rule": {\n "go_above": 0.6,\n "min_answers": 40\n }\n}\n```\n\n## Yes, mostly or no (`yes_mostly_no`)\n\n- Use: Yes, Mostly or No. Set this type when you want the middle answer. A plain yes/no question is yes_no. Takes go_rule like yes_no.\n- Options: Fixed: Yes, Mostly, No. Do not send options.\n- Answer: One of the three. With go_rule, Mostly counts as half a Yes in the verdict.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "yes_mostly_no",\n "text": "Does this button label tell you what will happen?",\n "context": "Button: Save and continue",\n "language": "en",\n "n": 50\n}\n```\n\n## Free text (`free_text`)\n\n- Use: Why, in the head\'s own words. Best as a follow-up to a choice.\n- Options: No options. Needs Tier 2 or 3. Answers are up to 200 characters.\n- Answer: Short text per head; results carry the texts and a summary.\n- Tier: 2 or 3. Format \xD7 2.0.\n\n```json\n{\n "type": "free_text",\n "text": "Why would you order from Menu B?",\n "language": "en",\n "n": 20,\n "tier": 2\n}\n```\n\n## Click test (`click_test`)\n\n- Use: Where people look or tap first on a page, ad, pack or screen. Results are a heatmap.\n- Options: No options. stimulus.image_url is required; max_taps 1 to 5 (default 1).\n- Answer: One to max_taps points per head, 0\u20131 from the top left. Results carry every tap, the busiest areas with counts and a heatmap PNG.\n- Tier: any. Format \xD7 1.5.\n\n```json\n{\n "type": "click_test",\n "text": "Where would you tap to buy this?",\n "language": "en",\n "stimulus": {\n "image_url": "https://example.com/product-page.png"\n },\n "max_taps": 1,\n "n": 50\n}\n```\n\n## Reaction (`reaction`)\n\n- Use: A gut reaction to an image or line: a logo, a cover, an ad. Five faces drawn as glyphs.\n- Options: Fixed: Love it, Like it, Not sure, Dislike it, Hate it. Do not send options.\n- Answer: One of the five; results add a positive, neutral and negative split.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "reaction",\n "text": "How does this cover make you feel?",\n "language": "en",\n "stimulus": {\n "image_url": "https://example.com/cover.png"\n },\n "n": 50\n}\n```\n',
|
|
10218
10218
|
"references/tools.md": "# 50heads tools beyond asking\n\n50heads has nine tools, and every tool takes an `action` plus that action's own arguments: `estimate`, `ask`, `results`, `questions`, `projects`, `webhooks`, `organization`, `audit` and `help`. Below, \"`results` action `get`\" means the tool `results` called with `action: \"get\"`. Each action is checked against its own scope, so a connection can read without being able to change anything.\n\nThe core loop is `estimate` action `quote`, `ask` action `ask`, then the task (or `results` action `wait`) and `results` action `get`. These actions cover the rest.\n\n## Before asking\n\n- `estimate` action `quote`: price, time and any fixes for a question; never spends. `estimate` action `balance`: your credits, what live questions have reserved and what is left under the connection's daily cap; check it before asking something large.\n- `ask` action `upload_image`: for a local file or a generated image, send it as base64 in `data` (JPEG, PNG or WebP, up to 5 MB; about 700 KB through the hosted server, which takes 1 MB requests). For an image already online, pass `image_url` and 50heads copies it. Use the returned `image_url` in the question. Costs nothing.\n- `estimate` action `audiences`: interest audiences, panels of heads who proved they fit (UK commuter cyclists, for example). Put an id in `question.audience` to ask one instead of targeting; the price is the audience's at the minimum grade.\n- `estimate` action `targeting`: countries with the languages their heads read and pool size bands, and the tag ids you can target at Tier 2 and 3. Each condition shrinks the pool; `estimate` action `quote` shows `pool_size`.\n- `ask` action `build_link`: when a person should press Ask themselves, give them this link. It opens the portal composer with the question filled in and asks nothing. It also opens a template (`template_id`), a follow-up (`follow_up_of`) or a re-ask of the unanswered part (`reask`).\n- `estimate` action `templates` and `results` action `list`: a fixed-price template may fit, and a recent answer may already cover the question. `results` action `list` takes `set_id` to list one set's questions in order.\n- `ask` action `set`: two to ten questions for the person's own audience behind one link, answered in order, about five seconds each. Same question shapes as `ask` action `ask` without tier, rush, targeting, reasons or free text; `max_answers`, `open_for_days`, `shown_as` and `public_results` are set once for the set. Returns the link, the `question_ids` in order and the reserve (questions \xD7 max answers \xD7 5 credits). Results are per question.\n\n## Go or no go, and who beats whom\n\n- `go_rule` on a `yes_no` or `yes_mostly_no` question: `{ \"go_above\": 0.6, \"min_answers\": 40 }` means go when Yes is above 60%, with at least 40 answers. `go_above` is a whole percentage from 0.5 to 0.95; `min_answers` is at least 5 and at most `n`, and defaults to 80% of `n`. On `yes_mostly_no`, Mostly counts as half a Yes. Use it for approval-style questions, where you will act on the answer: \"Is this label clear enough to ship?\" Set it before asking: the line cannot move once the question is live, and it costs nothing extra. Other types refuse it.\n- `verdict` in the results: `go` when the whole 95% range on the Yes share (`low` to `high`) is above `go_above`, `no_go` when it is all at or below it, otherwise `unclear`, with `reason` `too_few` (fewer than `min_answers`) or `too_close` (the range crosses the line; `questions` action `add_heads` can settle it). The summary note opens with the same sentence. Report it as how these heads answered against the line, not as a fact.\n- `head_to_head` for `ranking`, and `pairwise` with 3 or more options: `share[i][j]` is the share of people who compared options i and j and put i above j, and `n[i][j]` how many compared them. Use it to say who beats whom, not just who came first.\n- Pairwise rows also carry `low` and `high`, a 95% range on each win share. When the top two ranges overlap, the top two are close and the lead may be chance.\n\n## After the answers\n\n- `results` action `answers`: individual answers, 50 a page (up to 200), newest first, with `next_cursor`. Filter by `option` (0 is the first), `tier`, `country`, `age_band` or a keyword `q` in written answers and reasons. Country and age filters show nothing when fewer than 5 answers match, so no head can be singled out.\n- `questions` action `add_heads`: when the margin is under 10 points with 50 heads, ask more of the same question instead of a new one. It needs its own fresh `idempotency_key` and spends at the same price per answer; say the price and time before you do it when a person is present.\n- `questions` action `flag_answer`: an answer that is off-topic, low effort, offensive or a duplicate, by its `attestation_ref`. Upheld flags remove the answer and refund it. Never flag an answer because you dislike it.\n- `results` action `export`: `csv` has every answer (with the same filters as `results` action `answers`); `jsonl` has the same answers as JSON lines, one object per answer with `choice` (option indexes) and `cohortHash`, for scripts and model training; `pdf` is a one-page report and `png` the result card. The API serves all four.\n- `choice` on each answer (in `results` action `get`, `results` action `answers` and the JSONL export) is the answer as indexes into the options: `index` (one pick, or a rating's 1 to 5 as 0 to 4), `indexes` (pick several), `order` (ranking, best first) or `pair` (the two options shown in a pairwise matchup of 3 or more options). Absent for free text and click tests.\n- `cohort_hash` in `results` action `get` (`cohortHash` in the JSONL export): the same value means the same kind of audience was asked (who answers, how many, which tier and targeting, language and type). It never covers the words asked and never identifies anyone. Use it to group results from different questions put to the same audience.\n- `questions` action `cancel`: stops a live question and refunds the heads who have not answered.\n\n## Filing questions\n\n- `projects` action `list`, `projects` action `create`, `projects` action `update`, `projects` action `delete`: projects group questions under a name and a description. `projects` action `list` shows each with its question count; archived projects only with `include_archived`. `projects` action `update` renames, redescribes or archives one; archiving leaves its questions as they are. `projects` action `delete` removes the project for good but never its questions: they keep their answers and results and are left outside any project. Confirm with the person before deleting.\n- `questions` action `file`: moves one question into a project (`project_id`, or `null` to take it out), replaces its `labels` (up to 10, no commas), archives or bookmarks it, or sets your `external_ref`. Send only what should change. `external_ref` is set once: the same value again is fine, a different one is refused. Cancel a live question before archiving it.\n- `projects` action `labels`: the labels in use, most used first, with counts.\n- `ask` actions `ask` and `set` take `project_id` and `labels` to file as they ask; `results` action `list` filters by `project_id`, `label`, `external_ref`, `bookmarked` and `archived`.\n\nWith a team key, projects and labels are the team's.\n\n## Webhooks\n\nWebhooks send events (a question completed, underfilled or refused, credits low, and more) to an https address as they happen, so a script or a CI job does not have to poll. They need the `webhooks:read` and `webhooks:write` scopes, which a connection gets only when the person grants them. Read `50heads://webhook-events` for every event type, what it carries and the links to its JSON Schema.\n\n- `webhooks` action `create`: `url`, `events`, an optional `description`, and a `filter` of `project_ids` or `labels` to send question events only for those. It sends this account's question events to that address, so only use an address the person owns and asked for, and confirm it with them first. The signing secret is in the reply once: give it to the person to store with the receiver. Then `webhooks` action `test`.\n- `webhooks` action `list`: each endpoint with its events, filter, whether it is on and the last delivery's status. Secrets are masked.\n- `webhooks` action `update`: change `url`, `events`, `description` or `filter` (`null` clears it). `enabled: false` pauses; `enabled: true` turns it back on, also after 50heads switched it off for failing.\n- `webhooks` action `rotate_secret`: a new secret, returned once. The old one keeps signing for `overlap_hours` (default 24, up to 168), so the receiver can switch without missing a delivery; `0` cuts over at once.\n- `webhooks` action `test`: sends a signed `webhook.test` event now and says how the receiver answered.\n- `webhooks` action `deliveries`: the latest 100, filtered by `endpoint_id` or `state`. `failed` means out of retries (8 attempts over about a day).\n- `webhooks` action `events`: the latest events of one `type` in this account, newest first (`limit` 1 to 25, default 3), each exactly as a delivery's body carries it. Events are kept whether or not an endpoint listens: use one as a sample payload when writing a receiver.\n- `webhooks` action `replay`: sends a delivery's event again, with the same event id, so receivers that drop duplicates stay safe.\n- `webhooks` action `delete`: removes the endpoint for good; pausing is usually better. Confirm with the person first.\n\nEach delivery is signed twice: Standard Webhooks headers (`webhook-id`, `webhook-timestamp`, `webhook-signature`) and `X-50heads-Signature`. Verify either one, refuse timestamps more than 5 minutes old, and drop event ids you have already handled. `50heads webhooks verify` checks a captured delivery offline.\n\n## Slack and Zapier\n\n- `organization` action `apps`: the Slack workspaces 50heads is added to, each with its daily spend cap and what it has spent today, in credits, and who added it. People in those workspaces ask with `/50heads ask`, spending this account's credits within that cap. It also lists the Zapier accounts connected to this one (`zapier`), each with its daily cap, today's spend and live hooks, one per Zap trigger. It needs the `apps:read` scope. Adding, changing the cap and removing happen in the portal (Settings, Integrations), not from here; removing a Zapier connection deletes its hooks.\n\n## Organization (admins)\n\nThese read an organization and never change it. They work with an organization admin's key or connected app that holds the scope, or with one of the organization's own service accounts; anyone else gets `insufficient_scope` or `organization_admin_required`. Changes to domains, sign-in rules, single sign-on, SCIM and service accounts are made by a person in the portal (Settings, Organization).\n\n- `organization` action `get` (`organization:read`): the organization of the workspace you act in: workspaces, verified domains, whether single sign-on is set up or required, whether SCIM is connected, its sign-in rules.\n- `organization` action `domains` (`organization:read`): each domain's state and the DNS TXT record that proves it, to pass to whoever manages DNS.\n- `audit` action `list` (`audit:read`): who did what, newest first. Filter with `from`, `to`, `actor` (a user id or a service account id, `sa_\u2026`), `event_action` (an audit action such as `domain.added`, or a group such as `sso`) and `workspace_id`; page with `next_cursor`. Each event says whether a person, a key, a connected app, a service account, SCIM or 50heads acted.\n- `audit` action `export` (`audit:read`): the same events as JSON lines, oldest first, up to `max_events` at a time with a `resume_cursor`. Every export is itself recorded in the log.\n- `organization` action `scim` (`organization:read`): SCIM provisioning: how many people and groups the identity provider has sent, the default role, and its tokens by label and prefix.\n- `organization` action `member_sessions` (`members:read`): where one person is signed in, and how each session started.\n- `organization` action `service_accounts` (`organization:read`): the organization's service accounts, with their workspace, scopes, caps in credits, today's spend and last token. Never their secrets.\n\nEvents and lists never hold secrets, one-time codes or anything that identifies a head.\n\n## Help\n\n- `help` action `search`: the help center, for questions about credits, refunds, verification, tiers, the API or this server.\n- `help` action `feedback`: tells support about a problem or an idea. Signed out, add `email`. Leave out personal data about other people.\n- `help` action `whoami`: who the connection acts as (email masked), its scopes, daily and per-question caps and today's spend, the account and organization, and the rate limits with what is used. Call it first when something is refused.\n- `help` action `status`: whether 50heads is working and whether asking, answering, MCP asking or buying credits is paused. Needs no sign-in. Check it when calls fail, and do not ask while asking is paused.\n\n`questions` actions `add_heads` and `flag_answer`, and `results` action `export` (CSV, JSONL, PDF and PNG), are served by the API. Use them when the result calls for it.\n\n## Your data\n\nWe don't use your questions, the answers you buy or the reasons heads write to train AI models, and we don't sell them.\n",
|
|
@@ -11193,7 +11193,7 @@ async function handleTaskRequest(method, rawParams, deps) {
|
|
|
11193
11193
|
|
|
11194
11194
|
// src/constants.ts
|
|
11195
11195
|
var SERVER_NAME = "50heads";
|
|
11196
|
-
var SERVER_VERSION = "2026.1013.
|
|
11196
|
+
var SERVER_VERSION = "2026.1013.2";
|
|
11197
11197
|
var USER_AGENT = `50heads-mcp/${SERVER_VERSION}`;
|
|
11198
11198
|
var MCP_RESOURCE_URL = "https://mcp.50heads.com/mcp";
|
|
11199
11199
|
var TOOL_ACTIONS = {
|
package/dist/index.js
CHANGED
|
@@ -9973,11 +9973,11 @@ function fromDraft(d) {
|
|
|
9973
9973
|
}
|
|
9974
9974
|
|
|
9975
9975
|
// src/generated/skill.ts
|
|
9976
|
-
var SKILL_VERSION = "2026.1013.
|
|
9976
|
+
var SKILL_VERSION = "2026.1013.2";
|
|
9977
9977
|
var SKILL_BODY = '# Asking 50heads\n\n50heads puts one short question to verified people and shows what they think.\n\n## When to ask\n\nAsk when the answer is a human reaction: which name, headline, image or menu people prefer, whether copy is clear, what they notice first. Never ask for facts, predictions, advice or research. Check recent `results` (`list`) first.\n\n## Eight rules for a good question\n\n1. One question a head can answer in five seconds.\n2. Ask about a preference or first impression, never a fact.\n3. Show the thing: images (`ab_image`, `upload_image`) for anything visual.\n4. Keep options short, parallel and few: two to four is best. Add Neither when a forced pick would mislead.\n5. Word it neutrally, with no hint of the answer you want.\n6. Put needed background in `context`, one line.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `yes_no` with `go_rule` to approve, `free_text` (Tier 2) for why.\n8. Match heads and tier to the stakes: 50 at Tier 1 for a quick read, 100 or more or Tier 2 for a decision. Target the real audience\'s countries and language.\n\n## How to ask\n\n1. Call `estimate` (`quote`); with a person present, show the price: "50 answers, $12.70." Don\'t promise a time.\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse it to retry.\n3. Wait on the task (older hosts: `results`, `wait`).\n\n## Reading results\n\nLead with the winner, the margin in points and the confidence. With 50 heads a margin under 10 points is noise: say so and suggest more heads. Report underfilled as underfilled. Quote the percentages, not adjectives.\n\nWith a `go_rule`, lead with the `verdict`: go, no go or unclear against the asker\'s line. `head_to_head` says who beats whom; overlapping ranges mean the lead may be chance.\n\n## Worked example\n\n"Which menu would you order from?": two photos, `ab_image`, 50 heads, Tier 1. B 68%, A 32%: "Menu B wins by 36 points. Confidence high."\n\n## Avoid\n\n- Double questions ("Is it clear and friendly?").\n- Personal data, or anything that identifies someone.\n- Re-asking to fish for a different answer.\n\n## Your data\n\nWe don\'t use your questions, the answers you buy or the reasons heads write to train AI models, and we don\'t sell them.\n\nMore: `references/question-types.md`, `pricing.md`, `tools.md`.\n';
|
|
9978
9978
|
var SKILL_FILES = {
|
|
9979
9979
|
"LICENSE": 'MIT License\n\nCopyright (c) 2026 50heads\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n',
|
|
9980
|
-
"SKILL.md": '---\nname: 50heads\ndescription: Ask fifty verified people a five-second question and get a distribution back; use when the work in hand needs a human preference, first impression or sanity check that a model cannot supply.\nlicense: MIT\nmetadata:\n version: "2026.1013.
|
|
9980
|
+
"SKILL.md": '---\nname: 50heads\ndescription: Ask fifty verified people a five-second question and get a distribution back; use when the work in hand needs a human preference, first impression or sanity check that a model cannot supply.\nlicense: MIT\nmetadata:\n version: "2026.1013.2"\n homepage: https://50heads.com/agents\nallowed-tools: "50heads:*"\n---\n\n# Asking 50heads\n\n50heads puts one short question to verified people and shows what they think.\n\n## When to ask\n\nAsk when the answer is a human reaction: which name, headline, image or menu people prefer, whether copy is clear, what they notice first. Never ask for facts, predictions, advice or research. Check recent `results` (`list`) first.\n\n## Eight rules for a good question\n\n1. One question a head can answer in five seconds.\n2. Ask about a preference or first impression, never a fact.\n3. Show the thing: images (`ab_image`, `upload_image`) for anything visual.\n4. Keep options short, parallel and few: two to four is best. Add Neither when a forced pick would mislead.\n5. Word it neutrally, with no hint of the answer you want.\n6. Put needed background in `context`, one line.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `yes_no` with `go_rule` to approve, `free_text` (Tier 2) for why.\n8. Match heads and tier to the stakes: 50 at Tier 1 for a quick read, 100 or more or Tier 2 for a decision. Target the real audience\'s countries and language.\n\n## How to ask\n\n1. Call `estimate` (`quote`); with a person present, show the price: "50 answers, $12.70." Don\'t promise a time.\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse it to retry.\n3. Wait on the task (older hosts: `results`, `wait`).\n\n## Reading results\n\nLead with the winner, the margin in points and the confidence. With 50 heads a margin under 10 points is noise: say so and suggest more heads. Report underfilled as underfilled. Quote the percentages, not adjectives.\n\nWith a `go_rule`, lead with the `verdict`: go, no go or unclear against the asker\'s line. `head_to_head` says who beats whom; overlapping ranges mean the lead may be chance.\n\n## Worked example\n\n"Which menu would you order from?": two photos, `ab_image`, 50 heads, Tier 1. B 68%, A 32%: "Menu B wins by 36 points. Confidence high."\n\n## Avoid\n\n- Double questions ("Is it clear and friendly?").\n- Personal data, or anything that identifies someone.\n- Re-asking to fish for a different answer.\n\n## Your data\n\nWe don\'t use your questions, the answers you buy or the reasons heads write to train AI models, and we don\'t sell them.\n\nMore: `references/question-types.md`, `pricing.md`, `tools.md`.\n',
|
|
9981
9981
|
"references/pricing.md": '# Pricing\n\nPrices are in credits. `estimate` (quote and balance) and 50heads://pricing show them in your account currency at the day\'s rate. You pay per accepted answer; unanswered heads are refunded.\n\nPer answer = tier base \xD7 length \xD7 format, plus images and targeting traits, times 1.5 for rush. Total = per answer \xD7 heads.\n\n| Tier | Heads | Credits an answer | Credits for 50 answers |\n| --- | --- | --- | --- |\n| 1 | phone-verified | 20 | 1000 |\n| 2 | ID-verified | 42 | 2100 |\n| 3 | established heads | 80 | 4000 |\n\nLength (question, context and options together): up to 150 characters \xD7 1.0, up to 300 \xD7 1.1, up to 600 \xD7 1.25.\n\nFormat: `single_choice` \xD7 1.0, `multi_choice` \xD7 1.1, `ab_image` \xD7 1.0, `pairwise` \xD7 1.1, `scale_1_5` \xD7 1.0, `ranking` \xD7 1.3, `yes_no` \xD7 1.0, `yes_mostly_no` \xD7 1.0, `free_text` \xD7 2.0, `click_test` \xD7 1.5, `reaction` \xD7 1.0.\n\nA reason with every answer (`reason`, not for free_text) adds to the format: optional + 0.3, required + 0.6. A required reason on a Tier 1 single choice is 20 \xD7 1.6 = 32 credits an answer. Heads get the same share of the higher price.\n\nImages: 7 credits an answer for each image (audio counts the same). Rush: \xD7 1.5. Five-second test: \xD7 1.3.\n\nTargeting: countries are free. Age, gender and each tag group are one trait each, 3 credits an answer per trait, up to 4, at any tier (PickFu charges about $0.40 per trait). See 50heads://targeting.\n\nHeads: 10 to 5000, default 50.\n\nYour audience (`answered_by: "private"`): a link you share instead of heads, 5 credits an accepted answer, reserved for the most answers the link accepts (`n`, default 100) and refunded for the rest when it closes. No tier, rush, targeting or images surcharge; no time estimate (people answer when you share the link); every result says the answers were not verified by 50heads.\n\nEvery connection has a daily spend cap (default 5,000 credits), set when you connect and editable in the dashboard. Call `balance` to see what is left.\n\nAlways call `estimate` (action quote) first: it returns the exact price, the time and any fixes the question needs, and never spends.\n',
|
|
9982
9982
|
"references/question-types.md": '# Question types\n\nEvery question has `type`, `text` (8 to 600 characters), `language` (such as `en` or `pt-BR`), and optionally `context` (one line, 120 characters), `stimulus` (an image or a line of text shown above the question), `n` (heads, default 50), `tier` (1 to 3, default 1), `rush` and `targeting`.\n\nThe format multiplier is part of the price: per answer = tier base \xD7 length \xD7 format, plus 5 credits an image.\n\nFive-second test: add `exposure_ms` (usually 5000) to an image stimulus on single_choice, multi_choice, yes_no, yes_mostly_no, scale_1_5, reaction or free_text. The app shows the image for that long, hides it, then asks, so the answer is a first impression or what people remember. \xD7 1.3.\nEvery type except `free_text` can ask for a short written reason with each answer: `reason: "optional"` (format + 0.3) or `"required"` (format + 0.6), 10 to 140 characters. Reasons come back on each answer, translated into your language when heads wrote in another, and `results` (action get) summarizes them (themes with counts and quotes, a sentiment split and a takeaway). Use it instead of a follow-up when you want the which and the why from the same heads.\n\n## Single choice (`single_choice`)\n\n- Use: Pick one of several: names, headlines, taglines, colors.\n- Options: 2 to 8 options, 40 characters each; images optional. Two to four reads best.\n- Answer: One option per head; the distribution counts each option.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "single_choice",\n "text": "Which name sounds most like a bakery?",\n "language": "en",\n "options": [\n {\n "label": "Crumb & Co"\n },\n {\n "label": "Loafers"\n },\n {\n "label": "Proof"\n }\n ],\n "n": 50\n}\n```\n\n## Multiple choice (`multi_choice`)\n\n- Use: Tick all that apply: which features matter, which words fit.\n- Options: 2 to 8 options, 40 characters each. Shares add up to more than 100%.\n- Answer: Any number of options per head; each option\'s share is of all heads.\n- Tier: any. Format \xD7 1.1.\n\n```json\n{\n "type": "multi_choice",\n "text": "Which of these would make you try a new coffee shop?",\n "language": "en",\n "options": [\n {\n "label": "Oat milk at no extra cost"\n },\n {\n "label": "Quiet seating"\n },\n {\n "label": "Loyalty card"\n }\n ],\n "n": 50\n}\n```\n\n## A or B image (`ab_image`)\n\n- Use: Two images side by side: menus, logos, screenshots, packaging.\n- Options: Exactly 2 options, each with an image_url (https, or a pre-signed upload). Labels optional.\n- Answer: One image per head.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "ab_image",\n "text": "Which menu would you order from?",\n "language": "en",\n "options": [\n {\n "label": "Menu A",\n "image_url": "https://example.com/menu-a.png"\n },\n {\n "label": "Menu B",\n "image_url": "https://example.com/menu-b.png"\n }\n ],\n "n": 50\n}\n```\n\n## Pairwise (`pairwise`)\n\n- Use: Compare options two at a time when there are too many to show at once.\n- Options: 2 to 8 options; each head sees one pair, balanced so every pair is seen about equally.\n- Answer: One pick per pair. With 3 or more options each row has count (wins), share (win share), a 95% range on it (low, high), appearances, a Bradley\u2013Terry strength and a rank. When the top two ranges overlap, the lead may be chance. head_to_head says who beats whom: share[i][j] is the share of people who put option i above option j.\n- Tier: any. Format \xD7 1.1.\n\n```json\n{\n "type": "pairwise",\n "text": "Which subject line would you open first?",\n "language": "en",\n "options": [\n {\n "label": "Your order is on its way"\n },\n {\n "label": "Good news: it has shipped"\n },\n {\n "label": "Tracking number inside"\n }\n ],\n "n": 100\n}\n```\n\n## Scale 1 to 5 (`scale_1_5`)\n\n- Use: How strongly: clarity, appeal, trust. Report the mean and the split.\n- Options: Fixed: 1, 2, 3, 4, 5. Do not send options.\n- Answer: A number from 1 to 5; results include the mean.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "scale_1_5",\n "text": "How clear is this sentence? 1 is not clear, 5 is very clear.",\n "context": "Your parcel will be left in a safe place if you are out.",\n "language": "en",\n "n": 50\n}\n```\n\n## Ranking (`ranking`)\n\n- Use: Put options in order of preference.\n- Options: 2 to 8 options; keep to five or fewer for a five-second answer.\n- Answer: A full order per head; the distribution carries each option\'s average rank, and head_to_head says who beats whom: share[i][j] is the share of people who put option i above option j.\n- Tier: any. Format \xD7 1.3.\n\n```json\n{\n "type": "ranking",\n "text": "Rank these pizza toppings, favorite first.",\n "language": "en",\n "options": [\n {\n "label": "Mushroom"\n },\n {\n "label": "Pepperoni"\n },\n {\n "label": "Olives"\n },\n {\n "label": "Pineapple"\n }\n ],\n "n": 50\n}\n```\n\n## Yes or no (`yes_no`)\n\n- Use: A binary check. Heads answer Yes or No. This is the yes/no type. For a middle answer, use yes_mostly_no. For an approval-style question, add go_rule to get a go or a no go when Yes clears your line.\n- Options: Fixed: Yes, No. Do not send options.\n- Answer: Yes or No. With go_rule ({ "go_above": 0.6, "min_answers": 40 }), results carry a verdict: go when the whole 95% range on the Yes share is above the line, no_go when it is all at or below it, otherwise unclear (too few answers, or the range crosses the line). The line is fixed once the question is live and costs nothing extra.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "yes_no",\n "text": "Does this button label tell you what will happen?",\n "context": "Button: Save and continue",\n "language": "en",\n "n": 50,\n "go_rule": {\n "go_above": 0.6,\n "min_answers": 40\n }\n}\n```\n\n## Yes, mostly or no (`yes_mostly_no`)\n\n- Use: Yes, Mostly or No. Set this type when you want the middle answer. A plain yes/no question is yes_no. Takes go_rule like yes_no.\n- Options: Fixed: Yes, Mostly, No. Do not send options.\n- Answer: One of the three. With go_rule, Mostly counts as half a Yes in the verdict.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "yes_mostly_no",\n "text": "Does this button label tell you what will happen?",\n "context": "Button: Save and continue",\n "language": "en",\n "n": 50\n}\n```\n\n## Free text (`free_text`)\n\n- Use: Why, in the head\'s own words. Best as a follow-up to a choice.\n- Options: No options. Needs Tier 2 or 3. Answers are up to 200 characters.\n- Answer: Short text per head; results carry the texts and a summary.\n- Tier: 2 or 3. Format \xD7 2.0.\n\n```json\n{\n "type": "free_text",\n "text": "Why would you order from Menu B?",\n "language": "en",\n "n": 20,\n "tier": 2\n}\n```\n\n## Click test (`click_test`)\n\n- Use: Where people look or tap first on a page, ad, pack or screen. Results are a heatmap.\n- Options: No options. stimulus.image_url is required; max_taps 1 to 5 (default 1).\n- Answer: One to max_taps points per head, 0\u20131 from the top left. Results carry every tap, the busiest areas with counts and a heatmap PNG.\n- Tier: any. Format \xD7 1.5.\n\n```json\n{\n "type": "click_test",\n "text": "Where would you tap to buy this?",\n "language": "en",\n "stimulus": {\n "image_url": "https://example.com/product-page.png"\n },\n "max_taps": 1,\n "n": 50\n}\n```\n\n## Reaction (`reaction`)\n\n- Use: A gut reaction to an image or line: a logo, a cover, an ad. Five faces drawn as glyphs.\n- Options: Fixed: Love it, Like it, Not sure, Dislike it, Hate it. Do not send options.\n- Answer: One of the five; results add a positive, neutral and negative split.\n- Tier: any. Format \xD7 1.0.\n\n```json\n{\n "type": "reaction",\n "text": "How does this cover make you feel?",\n "language": "en",\n "stimulus": {\n "image_url": "https://example.com/cover.png"\n },\n "n": 50\n}\n```\n',
|
|
9983
9983
|
"references/tools.md": "# 50heads tools beyond asking\n\n50heads has nine tools, and every tool takes an `action` plus that action's own arguments: `estimate`, `ask`, `results`, `questions`, `projects`, `webhooks`, `organization`, `audit` and `help`. Below, \"`results` action `get`\" means the tool `results` called with `action: \"get\"`. Each action is checked against its own scope, so a connection can read without being able to change anything.\n\nThe core loop is `estimate` action `quote`, `ask` action `ask`, then the task (or `results` action `wait`) and `results` action `get`. These actions cover the rest.\n\n## Before asking\n\n- `estimate` action `quote`: price, time and any fixes for a question; never spends. `estimate` action `balance`: your credits, what live questions have reserved and what is left under the connection's daily cap; check it before asking something large.\n- `ask` action `upload_image`: for a local file or a generated image, send it as base64 in `data` (JPEG, PNG or WebP, up to 5 MB; about 700 KB through the hosted server, which takes 1 MB requests). For an image already online, pass `image_url` and 50heads copies it. Use the returned `image_url` in the question. Costs nothing.\n- `estimate` action `audiences`: interest audiences, panels of heads who proved they fit (UK commuter cyclists, for example). Put an id in `question.audience` to ask one instead of targeting; the price is the audience's at the minimum grade.\n- `estimate` action `targeting`: countries with the languages their heads read and pool size bands, and the tag ids you can target at Tier 2 and 3. Each condition shrinks the pool; `estimate` action `quote` shows `pool_size`.\n- `ask` action `build_link`: when a person should press Ask themselves, give them this link. It opens the portal composer with the question filled in and asks nothing. It also opens a template (`template_id`), a follow-up (`follow_up_of`) or a re-ask of the unanswered part (`reask`).\n- `estimate` action `templates` and `results` action `list`: a fixed-price template may fit, and a recent answer may already cover the question. `results` action `list` takes `set_id` to list one set's questions in order.\n- `ask` action `set`: two to ten questions for the person's own audience behind one link, answered in order, about five seconds each. Same question shapes as `ask` action `ask` without tier, rush, targeting, reasons or free text; `max_answers`, `open_for_days`, `shown_as` and `public_results` are set once for the set. Returns the link, the `question_ids` in order and the reserve (questions \xD7 max answers \xD7 5 credits). Results are per question.\n\n## Go or no go, and who beats whom\n\n- `go_rule` on a `yes_no` or `yes_mostly_no` question: `{ \"go_above\": 0.6, \"min_answers\": 40 }` means go when Yes is above 60%, with at least 40 answers. `go_above` is a whole percentage from 0.5 to 0.95; `min_answers` is at least 5 and at most `n`, and defaults to 80% of `n`. On `yes_mostly_no`, Mostly counts as half a Yes. Use it for approval-style questions, where you will act on the answer: \"Is this label clear enough to ship?\" Set it before asking: the line cannot move once the question is live, and it costs nothing extra. Other types refuse it.\n- `verdict` in the results: `go` when the whole 95% range on the Yes share (`low` to `high`) is above `go_above`, `no_go` when it is all at or below it, otherwise `unclear`, with `reason` `too_few` (fewer than `min_answers`) or `too_close` (the range crosses the line; `questions` action `add_heads` can settle it). The summary note opens with the same sentence. Report it as how these heads answered against the line, not as a fact.\n- `head_to_head` for `ranking`, and `pairwise` with 3 or more options: `share[i][j]` is the share of people who compared options i and j and put i above j, and `n[i][j]` how many compared them. Use it to say who beats whom, not just who came first.\n- Pairwise rows also carry `low` and `high`, a 95% range on each win share. When the top two ranges overlap, the top two are close and the lead may be chance.\n\n## After the answers\n\n- `results` action `answers`: individual answers, 50 a page (up to 200), newest first, with `next_cursor`. Filter by `option` (0 is the first), `tier`, `country`, `age_band` or a keyword `q` in written answers and reasons. Country and age filters show nothing when fewer than 5 answers match, so no head can be singled out.\n- `questions` action `add_heads`: when the margin is under 10 points with 50 heads, ask more of the same question instead of a new one. It needs its own fresh `idempotency_key` and spends at the same price per answer; say the price and time before you do it when a person is present.\n- `questions` action `flag_answer`: an answer that is off-topic, low effort, offensive or a duplicate, by its `attestation_ref`. Upheld flags remove the answer and refund it. Never flag an answer because you dislike it.\n- `results` action `export`: `csv` has every answer (with the same filters as `results` action `answers`); `jsonl` has the same answers as JSON lines, one object per answer with `choice` (option indexes) and `cohortHash`, for scripts and model training; `pdf` is a one-page report and `png` the result card. The API serves all four.\n- `choice` on each answer (in `results` action `get`, `results` action `answers` and the JSONL export) is the answer as indexes into the options: `index` (one pick, or a rating's 1 to 5 as 0 to 4), `indexes` (pick several), `order` (ranking, best first) or `pair` (the two options shown in a pairwise matchup of 3 or more options). Absent for free text and click tests.\n- `cohort_hash` in `results` action `get` (`cohortHash` in the JSONL export): the same value means the same kind of audience was asked (who answers, how many, which tier and targeting, language and type). It never covers the words asked and never identifies anyone. Use it to group results from different questions put to the same audience.\n- `questions` action `cancel`: stops a live question and refunds the heads who have not answered.\n\n## Filing questions\n\n- `projects` action `list`, `projects` action `create`, `projects` action `update`, `projects` action `delete`: projects group questions under a name and a description. `projects` action `list` shows each with its question count; archived projects only with `include_archived`. `projects` action `update` renames, redescribes or archives one; archiving leaves its questions as they are. `projects` action `delete` removes the project for good but never its questions: they keep their answers and results and are left outside any project. Confirm with the person before deleting.\n- `questions` action `file`: moves one question into a project (`project_id`, or `null` to take it out), replaces its `labels` (up to 10, no commas), archives or bookmarks it, or sets your `external_ref`. Send only what should change. `external_ref` is set once: the same value again is fine, a different one is refused. Cancel a live question before archiving it.\n- `projects` action `labels`: the labels in use, most used first, with counts.\n- `ask` actions `ask` and `set` take `project_id` and `labels` to file as they ask; `results` action `list` filters by `project_id`, `label`, `external_ref`, `bookmarked` and `archived`.\n\nWith a team key, projects and labels are the team's.\n\n## Webhooks\n\nWebhooks send events (a question completed, underfilled or refused, credits low, and more) to an https address as they happen, so a script or a CI job does not have to poll. They need the `webhooks:read` and `webhooks:write` scopes, which a connection gets only when the person grants them. Read `50heads://webhook-events` for every event type, what it carries and the links to its JSON Schema.\n\n- `webhooks` action `create`: `url`, `events`, an optional `description`, and a `filter` of `project_ids` or `labels` to send question events only for those. It sends this account's question events to that address, so only use an address the person owns and asked for, and confirm it with them first. The signing secret is in the reply once: give it to the person to store with the receiver. Then `webhooks` action `test`.\n- `webhooks` action `list`: each endpoint with its events, filter, whether it is on and the last delivery's status. Secrets are masked.\n- `webhooks` action `update`: change `url`, `events`, `description` or `filter` (`null` clears it). `enabled: false` pauses; `enabled: true` turns it back on, also after 50heads switched it off for failing.\n- `webhooks` action `rotate_secret`: a new secret, returned once. The old one keeps signing for `overlap_hours` (default 24, up to 168), so the receiver can switch without missing a delivery; `0` cuts over at once.\n- `webhooks` action `test`: sends a signed `webhook.test` event now and says how the receiver answered.\n- `webhooks` action `deliveries`: the latest 100, filtered by `endpoint_id` or `state`. `failed` means out of retries (8 attempts over about a day).\n- `webhooks` action `events`: the latest events of one `type` in this account, newest first (`limit` 1 to 25, default 3), each exactly as a delivery's body carries it. Events are kept whether or not an endpoint listens: use one as a sample payload when writing a receiver.\n- `webhooks` action `replay`: sends a delivery's event again, with the same event id, so receivers that drop duplicates stay safe.\n- `webhooks` action `delete`: removes the endpoint for good; pausing is usually better. Confirm with the person first.\n\nEach delivery is signed twice: Standard Webhooks headers (`webhook-id`, `webhook-timestamp`, `webhook-signature`) and `X-50heads-Signature`. Verify either one, refuse timestamps more than 5 minutes old, and drop event ids you have already handled. `50heads webhooks verify` checks a captured delivery offline.\n\n## Slack and Zapier\n\n- `organization` action `apps`: the Slack workspaces 50heads is added to, each with its daily spend cap and what it has spent today, in credits, and who added it. People in those workspaces ask with `/50heads ask`, spending this account's credits within that cap. It also lists the Zapier accounts connected to this one (`zapier`), each with its daily cap, today's spend and live hooks, one per Zap trigger. It needs the `apps:read` scope. Adding, changing the cap and removing happen in the portal (Settings, Integrations), not from here; removing a Zapier connection deletes its hooks.\n\n## Organization (admins)\n\nThese read an organization and never change it. They work with an organization admin's key or connected app that holds the scope, or with one of the organization's own service accounts; anyone else gets `insufficient_scope` or `organization_admin_required`. Changes to domains, sign-in rules, single sign-on, SCIM and service accounts are made by a person in the portal (Settings, Organization).\n\n- `organization` action `get` (`organization:read`): the organization of the workspace you act in: workspaces, verified domains, whether single sign-on is set up or required, whether SCIM is connected, its sign-in rules.\n- `organization` action `domains` (`organization:read`): each domain's state and the DNS TXT record that proves it, to pass to whoever manages DNS.\n- `audit` action `list` (`audit:read`): who did what, newest first. Filter with `from`, `to`, `actor` (a user id or a service account id, `sa_\u2026`), `event_action` (an audit action such as `domain.added`, or a group such as `sso`) and `workspace_id`; page with `next_cursor`. Each event says whether a person, a key, a connected app, a service account, SCIM or 50heads acted.\n- `audit` action `export` (`audit:read`): the same events as JSON lines, oldest first, up to `max_events` at a time with a `resume_cursor`. Every export is itself recorded in the log.\n- `organization` action `scim` (`organization:read`): SCIM provisioning: how many people and groups the identity provider has sent, the default role, and its tokens by label and prefix.\n- `organization` action `member_sessions` (`members:read`): where one person is signed in, and how each session started.\n- `organization` action `service_accounts` (`organization:read`): the organization's service accounts, with their workspace, scopes, caps in credits, today's spend and last token. Never their secrets.\n\nEvents and lists never hold secrets, one-time codes or anything that identifies a head.\n\n## Help\n\n- `help` action `search`: the help center, for questions about credits, refunds, verification, tiers, the API or this server.\n- `help` action `feedback`: tells support about a problem or an idea. Signed out, add `email`. Leave out personal data about other people.\n- `help` action `whoami`: who the connection acts as (email masked), its scopes, daily and per-question caps and today's spend, the account and organization, and the rate limits with what is used. Call it first when something is refused.\n- `help` action `status`: whether 50heads is working and whether asking, answering, MCP asking or buying credits is paused. Needs no sign-in. Check it when calls fail, and do not ask while asking is paused.\n\n`questions` actions `add_heads` and `flag_answer`, and `results` action `export` (CSV, JSONL, PDF and PNG), are served by the API. Use them when the result calls for it.\n\n## Your data\n\nWe don't use your questions, the answers you buy or the reasons heads write to train AI models, and we don't sell them.\n",
|
|
@@ -10928,7 +10928,7 @@ async function handleTaskRequest(method, rawParams, deps) {
|
|
|
10928
10928
|
|
|
10929
10929
|
// src/constants.ts
|
|
10930
10930
|
var SERVER_NAME = "50heads";
|
|
10931
|
-
var SERVER_VERSION = "2026.1013.
|
|
10931
|
+
var SERVER_VERSION = "2026.1013.2";
|
|
10932
10932
|
var USER_AGENT = `50heads-mcp/${SERVER_VERSION}`;
|
|
10933
10933
|
var MCP_RESOURCE_URL = "https://mcp.50heads.com/mcp";
|
|
10934
10934
|
var TOOL_ACTIONS = {
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const SERVER_NAME = "50heads";
|
|
6
6
|
/** Calendar version (YYYY.MDD.N). Stamped at release by scripts/release.ts; never edit by hand. */
|
|
7
|
-
export declare const SERVER_VERSION = "2026.1013.
|
|
7
|
+
export declare const SERVER_VERSION = "2026.1013.2";
|
|
8
8
|
/** Sent by the CLI on every request, so the API can tell releases apart. */
|
|
9
|
-
export declare const USER_AGENT = "50heads-mcp/2026.1013.
|
|
9
|
+
export declare const USER_AGENT = "50heads-mcp/2026.1013.2";
|
|
10
10
|
export declare const MCP_RESOURCE_URL = "https://mcp.50heads.com/mcp";
|
|
11
11
|
/**
|
|
12
12
|
* The tools and, inside each, the actions it takes, with the scope each action needs (spec:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** The skill's version (front matter metadata.version); advertised as skillVersion. */
|
|
2
|
-
export declare const SKILL_VERSION = "2026.1013.
|
|
2
|
+
export declare const SKILL_VERSION = "2026.1013.2";
|
|
3
3
|
/** SKILL.md without its front matter: the 50heads://guide resource. */
|
|
4
4
|
export declare const SKILL_BODY = "# Asking 50heads\n\n50heads puts one short question to verified people and shows what they think.\n\n## When to ask\n\nAsk when the answer is a human reaction: which name, headline, image or menu people prefer, whether copy is clear, what they notice first. Never ask for facts, predictions, advice or research. Check recent `results` (`list`) first.\n\n## Eight rules for a good question\n\n1. One question a head can answer in five seconds.\n2. Ask about a preference or first impression, never a fact.\n3. Show the thing: images (`ab_image`, `upload_image`) for anything visual.\n4. Keep options short, parallel and few: two to four is best. Add Neither when a forced pick would mislead.\n5. Word it neutrally, with no hint of the answer you want.\n6. Put needed background in `context`, one line.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `yes_no` with `go_rule` to approve, `free_text` (Tier 2) for why.\n8. Match heads and tier to the stakes: 50 at Tier 1 for a quick read, 100 or more or Tier 2 for a decision. Target the real audience's countries and language.\n\n## How to ask\n\n1. Call `estimate` (`quote`); with a person present, show the price: \"50 answers, $12.70.\" Don't promise a time.\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse it to retry.\n3. Wait on the task (older hosts: `results`, `wait`).\n\n## Reading results\n\nLead with the winner, the margin in points and the confidence. With 50 heads a margin under 10 points is noise: say so and suggest more heads. Report underfilled as underfilled. Quote the percentages, not adjectives.\n\nWith a `go_rule`, lead with the `verdict`: go, no go or unclear against the asker's line. `head_to_head` says who beats whom; overlapping ranges mean the lead may be chance.\n\n## Worked example\n\n\"Which menu would you order from?\": two photos, `ab_image`, 50 heads, Tier 1. B 68%, A 32%: \"Menu B wins by 36 points. Confidence high.\"\n\n## Avoid\n\n- Double questions (\"Is it clear and friendly?\").\n- Personal data, or anything that identifies someone.\n- Re-asking to fish for a different answer.\n\n## Your data\n\nWe don't use your questions, the answers you buy or the reasons heads write to train AI models, and we don't sell them.\n\nMore: `references/question-types.md`, `pricing.md`, `tools.md`.\n";
|
|
5
5
|
/** Every file in the skill bundle, by path relative to skills/50heads. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@50heads/mcp",
|
|
3
|
-
"version": "2026.1013.
|
|
3
|
+
"version": "2026.1013.2",
|
|
4
4
|
"mcpName": "com.50heads/mcp",
|
|
5
5
|
"description": "50heads MCP: ask fifty verified people from Claude, ChatGPT, Cursor or your own agent.",
|
|
6
6
|
"keywords": [
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
"@types/node": "^22.18.0",
|
|
58
58
|
"esbuild": "^0.28.2",
|
|
59
59
|
"typescript": "^5.9.3",
|
|
60
|
-
"@50heads/
|
|
60
|
+
"@50heads/brand": "0.0.0",
|
|
61
61
|
"@50heads/login": "0.0.0",
|
|
62
|
-
"@50heads/
|
|
63
|
-
"@50heads/
|
|
62
|
+
"@50heads/shared": "0.0.0",
|
|
63
|
+
"@50heads/tsconfig": "0.0.0"
|
|
64
64
|
},
|
|
65
65
|
"scripts": {
|
|
66
66
|
"generate": "node scripts/generate.ts",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "com.50heads/mcp",
|
|
4
4
|
"title": "50heads",
|
|
5
5
|
"description": "Ask fifty verified people a five-second question and see what they think.",
|
|
6
|
-
"version": "2026.1013.
|
|
6
|
+
"version": "2026.1013.2",
|
|
7
7
|
"websiteUrl": "https://50heads.com/agents",
|
|
8
8
|
"repository": {
|
|
9
9
|
"url": "https://github.com/50heads/mcp",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"registryType": "npm",
|
|
45
45
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
46
46
|
"identifier": "@50heads/mcp",
|
|
47
|
-
"version": "2026.1013.
|
|
47
|
+
"version": "2026.1013.2",
|
|
48
48
|
"runtimeHint": "npx",
|
|
49
49
|
"transport": {
|
|
50
50
|
"type": "stdio"
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"audit:read"
|
|
92
92
|
]
|
|
93
93
|
},
|
|
94
|
-
"skillVersion": "2026.1013.
|
|
94
|
+
"skillVersion": "2026.1013.2"
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
}
|
package/skills/50heads/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: 50heads
|
|
|
3
3
|
description: Ask fifty verified people a five-second question and get a distribution back; use when the work in hand needs a human preference, first impression or sanity check that a model cannot supply.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "2026.1013.
|
|
6
|
+
version: "2026.1013.2"
|
|
7
7
|
homepage: https://50heads.com/agents
|
|
8
8
|
allowed-tools: "50heads:*"
|
|
9
9
|
---
|
package/skills/50heads.zip
CHANGED
|
Binary file
|