@50heads/mcp 2026.925.2 → 2026.1009.1

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.
@@ -4,14 +4,15 @@
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.925.2";
7
+ export declare const SERVER_VERSION = "2026.1009.1";
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.925.2";
9
+ export declare const USER_AGENT = "50heads-mcp/2026.1009.1";
10
10
  export declare const MCP_RESOURCE_URL = "https://mcp.50heads.com/mcp";
11
11
  /** The scope each tool needs (spec: Authorization → Scopes). null: no sign-in needed. */
12
12
  export declare const TOOL_SCOPES: {
13
13
  readonly estimate: "questions:write";
14
14
  readonly ask: "questions:write";
15
+ readonly ask_set: "questions:write";
15
16
  readonly get_results: "questions:read";
16
17
  readonly wait_for_results: "questions:read";
17
18
  readonly list_questions: "questions:read";
@@ -25,6 +26,7 @@ export declare const TOOL_SCOPES: {
25
26
  readonly export: "questions:read";
26
27
  readonly build_ask_link: null;
27
28
  readonly list_targeting: null;
29
+ readonly list_audiences: null;
28
30
  readonly search_help: null;
29
31
  readonly send_feedback: null;
30
32
  };
@@ -1,5 +1,5 @@
1
1
  /** The skill's version (front matter metadata.version); advertised as skillVersion. */
2
- export declare const SKILL_VERSION = "2026.925.2";
2
+ export declare const SKILL_VERSION = "2026.1009.1";
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 on their phones and returns how they split. Answers cost credits, priced in your currency; fifty take about ten minutes.\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. Before asking again, call `list_questions` and reuse a recent answer.\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. No leading words, no hint of the answer you want.\n6. Put background in `context`, one line, only when a head needs it.\n7. Pick the type that fits: `single_choice` to pick, `pairwise` for two, `ranking` for order, `scale_1_5` for strength, `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 countries and language of the real audience.\n\n## How to ask\n\n1. Call `estimate` and, when a person is present, show them the price and time together: \"50 answers, about 10 minutes, $12.70.\"\n2. Call `ask` with a fresh UUID as `idempotency_key`. Reuse that key if you retry.\n3. Wait on the task, or call `wait_for_results` on older hosts. `get_results` shows it while live.\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, not a verdict. Report underfilled as underfilled. Quote the split, not adjectives.\n\n## Worked example\n\n\"Which menu would you order from?\" with two menu photos, `ab_image`, 50 heads, Tier 1. Menu B 68%, Menu A 32%: \"Menu B wins by 36 points. Confidence high.\" Follow up with 20 Tier 2 heads saying why.\n\n## Avoid\n\n- Double questions (\"Is it clear and friendly?\").\n- Yes-or-no questions that lead.\n- Asking for personal data or anything that identifies someone.\n- Re-asking the same question to fish for a different answer.\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. */
@@ -5,6 +5,19 @@ import { QUESTION_LANGUAGES } from "@50heads/shared";
5
5
  * asks the caller (elicitation) rather than guess.
6
6
  */
7
7
  type Lang = (typeof QUESTION_LANGUAGES)[number];
8
- /** A language code, or null when the text is not clearly one language. */
8
+ /** A language its script alone gives away: kana is Japanese, Hangul Korean, Han without kana Chinese. */
9
+ export type ScriptLanguage = "ja" | "ko" | "zh";
10
+ /**
11
+ * The language of a text written in a script heads can only mean one way. Japanese is any kana
12
+ * (Han alone is ambiguous with Chinese, kana is not); Korean is Hangul; Chinese is Han with no
13
+ * kana. Null for every other script, including Latin, where stopwords decide.
14
+ */
15
+ export declare function detectScriptLanguage(text: string): ScriptLanguage | null;
16
+ /**
17
+ * A language code, or null when the text is not clearly one language. Script decides first:
18
+ * kana, Hangul and Han name ja, ko and zh outright, but only once that code is a question
19
+ * language (QUESTION_LANGUAGES); until then such text is null and the caller asks, as it does
20
+ * today. Latin text goes to the stopword count.
21
+ */
9
22
  export declare function detectLanguage(text: string): Lang | null;
10
23
  export {};
@@ -4,7 +4,7 @@
4
4
  */
5
5
  export declare const REGISTRY_NAME = "com.50heads/mcp";
6
6
  export declare const NPM_PACKAGE = "@50heads/mcp";
7
- export declare const DESCRIPTION = "Ask fifty verified real people a five-second question and get the split back.";
7
+ export declare const DESCRIPTION = "Ask fifty verified people a five-second question and get the split back.";
8
8
  export type ManifestOptions = {
9
9
  /** The hosted endpoint, https://mcp.50heads.com/mcp. */
10
10
  endpoint?: string;
@@ -93,7 +93,6 @@ export declare function registryServerJson(): {
93
93
  repository: {
94
94
  url: string;
95
95
  source: string;
96
- subfolder: string;
97
96
  };
98
97
  icons: {
99
98
  src: string;
@@ -23,6 +23,11 @@ export declare function formatPrice(p: {
23
23
  amount: number;
24
24
  currency: string;
25
25
  }, locale?: string): string;
26
+ /**
27
+ * Opening line of the package README. Generated into README.md so the published credit
28
+ * total stays the Tier 1 price from packages/shared (50 × per-answer credits).
29
+ */
30
+ export declare function readmeLead(): string;
26
31
  /** "about 10 minutes", "about 2 hours". */
27
32
  export declare function aboutMinutes(minutes: number): string;
28
33
  /** Cost and time in one sentence, per BRAND.md: "50 answers, about 10 minutes, $12.70." */