# 50heads (npm · @50heads/mcp)

Ask fifty verified people a five-second question and see what they think.

- Trust score: 86/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `mcp.50heads.com`: 32/100, [markdown](https://verifymcp.io/servers/com-50heads-mcp/mcp.md), [page](https://verifymcp.io/servers/com-50heads-mcp/mcp)
- npm · `@50heads/mcp`: 86/100 (this document), [markdown](https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp.md), [page](https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp)

## Channel facts

- Registry: `npm`
- Package: `@50heads/mcp`
- Version: `2026.1013.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 83/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects @modelcontextprotocol/server 2.0.0, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 0 of 3 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to 50heads/mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 22 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 74/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 8399 tokens (~349/item across 24 items; 9 tools + 15 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 73/100
  - Stability observed for 22 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

## Install

### How do I install the 50heads MCP server?

50heads runs locally as an npm package, launched with npx -y @50heads/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add com-50heads-mcp -- npx -y @50heads/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "com-50heads-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@50heads/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-50heads-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@50heads/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add com-50heads-mcp -- npx -y @50heads/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-50heads-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@50heads/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-50heads-mcp --command npx --arg -y --arg @50heads/mcp
```

### Hermes

```yaml
mcp_servers:
  com-50heads-mcp:
    command: "npx"
    args: ["-y", "@50heads/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "com-50heads-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@50heads/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-50heads-mcp -t stdio -c npx -a -y @50heads/mcp
```

### Other

```json
{
  "mcpServers": {
    "com-50heads-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@50heads/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 82, 0)

- [security regression] GHSA-f897-62hf-6gxq affects this package: high

### 2026-10-27 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-25 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (9)

### `estimate` (~546 tokens)

Estimate and plan a question

Price a question before asking it, check your credits, and look up what you can ask for: ready-made templates, interest audiences and targeting options. Never spends. Call quote first, and when a person is present show them the price and time together before you ask.

Pass action: one of quote, balance, templates, audiences, targeting. Each action takes only its own arguments.
\- quote: Price a question before asking it: credits, the price, how long it will take and any fixes it needs. Never spends. Call this first, and when a person is present show them the price and time together before you ask. Arguments: question (required), currency. Read-only; needs questions:write.
\- balance: Credits available, credits reserved by live questions, and what is left under this connection's daily spend cap. Check before asking something large. No other arguments. Read-only; needs account:read.
\- templates: Ready-made questions at a fixed price. Pick one, fill in its options and pass its question to ask (action ask) with template_id. No sign-in needed. No other arguments. Read-only; no sign-in needed.
\- audiences: Interest audiences: panels of heads who proved they ride, own, run or buy something (for example UK commuter cyclists). Put an id in question.audience to ask one instead of targeting; the price is the audience's at the minimum grade. No sign-in needed; signed in, private audiences your team sponsors are listed too. Arguments: q, country. Read-only; no sign-in needed.
\- targeting: Who can answer: countries with the languages their heads read and pool size bands by tier, the age bands and genders heads declare, and the tag catalog you can target at any tier. Use the codes and tag ids in question.targeting. No sign-in needed. Arguments: language. Read-only; no sign-in needed.

Input parameters:

- `action` (string, required): What to do. One of: quote, balance, templates, audiences, targeting. Each action takes its own arguments; see the tool description.
- `country` (string): Only audiences with heads in this country (ISO code). (Used by: audiences.)
- `currency` (string): Currency for the price. Default: your account currency. (Used by: quote.)
- `language` (string): Only countries whose heads read this language. (Used by: targeting.)
- `q` (string): Words in the audience's name or summary. (Used by: audiences.)
- `question`: The question. `type` picks the format; see 50heads://question-types for rules and examples. (Used by: quote.)

### `ask` (~1467 tokens)

Ask 50heads

Ask verified people a question and get their answers back as a distribution (ask), ask your own audience several questions behind one link (set), upload an image a question can show, or build a link for a person to press Ask themselves. ask and set spend credits within this connection's daily cap and need a fresh UUID as idempotency_key; retrying with the same key never charges twice. Uploading an image and building a link cost nothing. Ask about preferences and first impressions, never facts; read 50heads://guide for wording.

Pass action: one of ask, set, upload_image, build_link. Each action takes only its own arguments.
\- ask: Ask verified people a question and get their answers back as a distribution. Spends credits, within this connection's daily cap. Needs a fresh UUID as idempotency_key; retrying with the same key never charges twice. Returns a task to wait on, or on older hosts a question_id: then call results with action wait. If the organization holds asks over a limit for a person's approval, status is pending_approval and the task is input_required until someone approves at approval.approve_url; a denial ends it as refused_by_policy. Call estimate (action quote) first. Ask about preferences and first impressions, never facts; read 50heads://guide for wording. For a yes-or-no decision, add question.go_rule to get a go or a no go when Yes clears your line. Arguments: question (required), idempotency_key (required), template_id, variants, then, project_id, labels, external_ref. Changes something; needs questions:write.
\- set: Publish two to ten questions behind one link for people you know (your audience): they answer each in turn in the browser, about five seconds each, with no account. Each question keeps its own results (results, action get, per question_id); 5 credits an accepted answer, not verified by 50heads. Spends credits, within this connection's daily cap. Needs a fresh UUID as idempotency_key; retrying with the same key never charges twice. Fo…

Input parameters:

- `action` (string, required): What to do. One of: ask, set, upload_image, build_link. Each action takes its own arguments; see the tool description.
- `bulk` (boolean): Open the bulk composer (CSV or image sets). (Used by: build_link.)
- `content_type` (string): The type of data. Read from the bytes when left out. (Used by: upload_image.)
- `data` (string): The image as base64 (a data: URL is fine): JPEG, PNG or WebP, up to 5 MB. The hosted server takes requests up to 1 MB, so send bigger files by image_url or through the stdio server. (Used by: upload_…
- `draft` (object): The question to fill in: text, type, options and images, heads (n), tier, rush, countries and tags (targeting). Every field is optional. (Used by: build_link.)
- `external_ref` (string): Your own id for it (an order, a ticket, a test run). Set once; find it with results, action list. (Used by: ask.)
- `follow_up_of` (string): Open a follow-up to this question_id. (Used by: build_link.)
- `idempotency_key` (string): ask: A fresh UUID for this ask. Retrying with the same key returns the same question and never charges twice. set: A fresh UUID for this set. Retrying with the same key returns the same set and never…
- `image_url` (string): A public https image to copy into 50heads. Use this for images already online. (Used by: upload_image.)
- `labels` (array): ask: Labels to find it by later with results, action list. set: Labels on every question, to find them by later.
- `max_answers` (integer): The most answers each question accepts, 10 to 5000. Default 100. The reserve is questions × max_answers × 5 credits. (Used by: set.)
- `open_for_days`: private only: days the link stays open. Default 7. (Used by: set.)
- `project_id` (string): ask: File it in one of your projects. set: File every question in one of your projects.
- `public_results` (boolean): People see each question's bars after their own answers. Default false. (Used by: set.)
- `question`: The question. `type` picks the format; see 50heads://question-types for rules and examples. (Used by: ask.)
- `questions` (array): 2 to 10 questions, answered in this order, about five seconds each. The same question shapes as ask; tier, rush, targeting, audience, reason and free text do not apply, and answered_by, n, open_for_d…
- `reask` (string): Re-ask the unanswered part of this question_id. (Used by: build_link.)
- `shown_as` (string): private only: your organization's name on the answer page ("Acme asks"). Plain text, reviewed with the question. (Used by: set.)
- `template_id` (string): ask: Ask from a template (see estimate, action templates) at its fixed price. build_link: Open a template instead of a blank question.
- `then` (array): Follow-ups asked when this completes, such as 20 Tier 2 heads explaining the winner. (Used by: ask.)
- `variants` (array): The same question in other languages; each is asked separately with its own question_id. (Used by: ask.)

### `results` (~1395 tokens)

Read results and answers

Read what people answered: the results so far (get), wait for them (wait), single answers (answers), a file (export) and your list of questions (list). Read-only. Check list before asking again: a recent answer may already cover it.

Pass action: one of get, wait, answers, export, list. Each action takes only its own arguments.
\- get: The results so far for a question: status, how many answered, the share per option, the winner, margin and confidence, a verdict (go, no_go or unclear) for a yes-or-no question asked with a go_rule, who beats whom (head_to_head) for ranking and pairwise, and a 95% range on each pairwise win share, breakdowns by country, tier, age band, gender and tag (groups of 5 or more), taps and hot spots for click tests, the share per reaction, any written answers and reasons (translated into the account's language), and a summary of them (themes, sentiment, a takeaway). Each answer carries choice (option indexes) and the result a cohort_hash: the same value means the same kind of audience was asked, so results can be grouped across questions. Filter by option, tier, country, age_band, gender or keyword to read one group. Does not wait: while the question is live it returns a partial result. Arguments: question_id (required), currency, option, tier, country, age_band, gender, keyword. Read-only; needs questions:read.
\- wait: Waits on the server until the question is answered, or min_answers are in, or the timeout passes (default 300 s, most 600), then returns the results. One call instead of polling. If it comes back still live, call it again. Arguments: question_id (required), min_answers, timeout_seconds. Read-only; needs questions:read.
\- answers: Individual answers to a question, newest first, a page at a time: the option picked (and choice, as option indexes), any written answer or reason, tier and an attestation_ref. Filter by option, tier, country, age band or a keyword (q); pass next_cursor for the next page. Answers never identify a head.…

Input parameters:

- `action` (string, required): What to do. One of: get, wait, answers, export, list. Each action takes its own arguments; see the tool description.
- `age_band` (string): get: Only this age band, such as "25-34" (the ID check, else what heads declared). Fewer than 5 show none. answers, export: Such as "25-34". Shows nothing unless 5 or more answers match.
- `archived` (string): Archived questions are left out unless you ask for them (default exclude). (Used by: list.)
- `bookmarked` (boolean): Only bookmarked questions (true) or the others (false). (Used by: list.)
- `country` (string): get: Only answers from this country (ISO code). Fewer than 5 answers show none. answers, export: ISO country code. Shows nothing unless 5 or more answers match.
- `currency` (string): Currency for the price. Default: your account currency. (Used by: get.)
- `cursor` (string): next_cursor from the previous page. (Used by: answers, list.)
- `external_ref` (string): Only the question with your own reference, set when asked. (Used by: list.)
- `format` (string): csv: every answer. jsonl: every answer as JSON lines (one object per answer, with option indexes and the cohort hash), for scripts and model training. pdf: a one-page report. png: the result card. De…
- `gender` (string): get: Only heads who declared this gender. Fewer than 5 show none. answers, export: Declared gender. Shows nothing unless 5 or more answers match.
- `keyword` (string): Only answers whose written words (reason or free text) contain this. (Used by: get.)
- `label` (string): Only questions with this label. (Used by: list.)
- `limit` (integer): answers: Answers per page. Default 50. list: Default 20.
- `min_answers` (integer): Return as soon as this many heads have answered. (Used by: wait.)
- `option` (integer): get: Only answers that picked this option (0-based; ranking: ranked it first). answers, export: Only answers that picked this option (0 is the first).
- `project_id` (string): Only questions in this project. (Used by: list.)
- `q` (string): A word or phrase in written answers and reasons. (Used by: answers, export.)
- `question_id` (string): The question_id from ask or results (action list). (Used by: get, wait, answers, export.)
- `set_id` (string): Only the questions of one set (from ask, action set), in order. (Used by: list.)
- `since` (string): Only questions asked after this time (ISO 8601). (Used by: list.)
- `status` (string): Only questions in this state. (Used by: list.)
- `tier` (integer): get: Only answers from heads at this tier. answers, export: Only answers from this tier.
- `timeout_seconds` (integer): How long to wait on the server. Default 300, most 600. (Used by: wait.)

### `questions` (~786 tokens)

Change a question

Change one question you asked: stop it (cancel), ask more heads (add_heads), report an answer that looks off (flag_answer), or file it into a project, label it, archive it, bookmark it or set your own reference (file). cancel stops a live question and refunds the heads who have not answered.

Pass action: one of cancel, add_heads, flag_answer, file. Each action takes only its own arguments.
\- cancel: Stops a live question. Heads who have not answered are refunded; answers already given are kept and paid for. Safe to call twice. Arguments: question_id (required). Destructive; needs questions:write.
\- add_heads: Asks more heads the same question, with the same targeting, and merges their answers into the same result. Spends credits at the question's per-answer price, within this connection's daily cap. Needs a fresh UUID as idempotency_key; retrying with it never charges twice. Arguments: question_id (required), n (required), idempotency_key (required). Changes something; needs questions:write.
\- flag_answer: Reports one answer that looks off-topic, low effort, abusive or automated, by its attestation_ref from results (actions answers or get). 50heads reviews it; an upheld flag removes the answer and refunds it. Flagging the same answer again changes nothing. Arguments: question_id (required), attestation_ref (required), reason (required), note. Changes something; needs questions:write.
\- file: Files one of your questions: moves it into a project (project_id, or null to take it out), replaces its labels (up to 10), archives or unarchives it, bookmarks it, or sets your own external_ref. Send only what should change. external_ref is set once: the same value again is fine, a different one is refused. A live question must be canceled before it is archived. Costs nothing and returns the question as results (action list) shows it. Arguments: question_id (required), project_id, labels, archived, bookmarked, external_ref. Changes something; needs questions:write.

Input parameters:

- `action` (string, required): What to do. One of: cancel, add_heads, flag_answer, file. Each action takes its own arguments; see the tool description.
- `archived` (boolean): true archives it (a live question must be canceled first), false brings it back. (Used by: file.)
- `attestation_ref` (string): From results (actions answers or get) answers[]. (Used by: flag_answer.)
- `bookmarked` (boolean): true bookmarks it, false removes the bookmark. (Used by: file.)
- `external_ref` (string): Your own id for it (an order, a ticket, a test run). Set once: a different value later is refused. (Used by: file.)
- `idempotency_key` (string): A fresh UUID. Retrying with the same key never adds or charges twice. (Used by: add_heads.)
- `labels` (array): Replaces its labels (up to 10, 40 characters each, no commas); [] clears them. (Used by: file.)
- `n` (integer): How many more heads to ask. At least 10. (Used by: add_heads.)
- `note` (string): What is wrong with it, in a sentence. (Used by: flag_answer.)
- `project_id`: Move it into this project (from projects, action list); null takes it out of its project. (Used by: file.)
- `question_id` (string): The question_id from ask or results (action list).
- `reason` (string): off_topic, low_effort, abusive, or automated (looks like a bot or copy-paste). (Used by: flag_answer.)

### `projects` (~611 tokens)

Projects and labels

Keep questions findable: list, create, update (rename, describe, archive) and delete projects, and list the labels on your questions. A project groups questions; delete removes the project only, never its questions. File a question with questions (action file) or with project_id and labels when asking.

Pass action: one of list, create, update, delete, labels. Each action takes only its own arguments.
\- list: Your projects: groups of questions with a name and a description, bookmarked first, each with how many questions are filed in it. Archived projects are left out unless include_archived is true. A key made for a team lists the team's projects. Use a project_id with ask (actions ask and set), questions (action file) or results (action list). Arguments: include_archived. Read-only; needs questions:read.
\- create: Makes a project to group questions, with a name and an optional description. Costs nothing. File questions in it with project_id on ask (actions ask and set), or later with questions (action file). Calling it twice makes two projects. Arguments: name (required), description. Changes something; needs questions:write.
\- update: Renames a project, changes its description, or archives it (archived: true) or brings it back (false). Archiving a project leaves its questions as they are. Costs nothing. Arguments: project_id (required), name, description, archived. Changes something; needs questions:write.
\- delete: Deletes a project for good. Its questions are not deleted: they keep their answers, results, labels and bookmarks, and are no longer in any project. Nothing is charged or refunded. To keep the project but hide it, use action update with archived: true instead. Confirm with the person first. Arguments: project_id (required). Destructive; needs questions:write.
\- labels: The labels on your questions, most used first, with how many questions carry each. Use one as label in results (action list), or reuse it in questions (action file) or ask. No other arg…

Input parameters:

- `action` (string, required): What to do. One of: list, create, update, delete, labels. Each action takes its own arguments; see the tool description.
- `archived` (boolean): true archives the project, false brings it back. Its questions stay as they are. (Used by: update.)
- `description`: create: What the project is for, up to 500 characters. update: A new description; null or an empty string clears it.
- `include_archived` (boolean): Also list archived projects. Default false. (Used by: list.)
- `name` (string): create: The project's name, up to 80 characters. update: A new name.
- `project_id` (string): The project_id from projects, actions list or create. (Used by: update, delete.)

### `webhooks` (~1198 tokens)

Webhooks

Webhook endpoints that 50heads sends signed events to: list, create, update, rotate the signing secret, test, read deliveries and recent events, replay a delivery, and delete. Question events carry question ids, status, labels, projects and the results summary, so only use an address the person owns and has asked for. Read 50heads://webhook-events for the event types.

Pass action: one of list, create, update, rotate_secret, test, deliveries, events, replay, delete. Each action takes only its own arguments.
\- list: The webhook endpoints of this account (personal, or the team the connection acts for): address, events, filter, whether each is on, and how the last delivery went. Secrets are masked. No other arguments. Read-only; needs webhooks:read.
\- create: Adds a webhook endpoint: 50heads then sends the chosen events, signed, to that https address as they happen. Question events carry question ids, status, labels, projects and the results summary, so only use an address the person owns and has asked for, and confirm it with them first. The signing secret is in this reply only; give it to the person to store with the receiver. Read 50heads://webhook-events for the event types. Arguments: url (required), events (required), description, filter. Changes something; needs webhooks:write.
\- update: Changes a webhook endpoint's address, events, description or filter (filter null clears it), or pauses it (enabled false) and turns it back on (enabled true), also after it was switched off for failing. A new address gets this account's events: confirm it with the person first. Arguments: id (required), url, events, description, enabled, filter. Changes something; needs webhooks:write.
\- rotate_secret: Makes a new signing secret for a webhook endpoint and returns it once, in this reply only. The old secret keeps signing beside the new one for overlap_hours (default 24, up to 168), so the receiver can switch without missing a delivery; 0 cuts over at once and deliveries fail unt…

Input parameters:

- `action` (string, required): What to do. One of: list, create, update, rotate_secret, test, deliveries, events, replay, delete. Each action takes its own arguments; see the tool description.
- `delivery_id` (string): The delivery to send again, such as dlv_…. (Used by: replay.)
- `description`: create: A short note to tell endpoints apart. update: null clears it.
- `enabled` (boolean): false pauses deliveries; true resumes, also after it was switched off for failing. (Used by: update.)
- `endpoint_id` (string): Only this endpoint's deliveries. (Used by: deliveries.)
- `events` (array): create: Event types to send. Read 50heads://webhook-events for what each one carries. update: Replaces the list.
- `filter`: create: Question events only for these projects or labels. Events about credits and connections always pass. update: Replaces the filter; null clears it, so every event passes.
- `id` (string): The endpoint id, such as whe_…. (Used by: update, rotate_secret, test, delete.)
- `limit` (integer): How many, newest first: 1 to 25. Default 3. (Used by: events.)
- `overlap_hours` (integer): Hours the old secret keeps signing beside the new one, 0 to 168. Default 24; 0 cuts over at once. (Used by: rotate_secret.)
- `state` (string): failed: out of retries; replay them once the receiver is fixed. (Used by: deliveries.)
- `type` (string): The event type, such as question.completed. Read 50heads://webhook-events for them all. (Used by: events.)
- `url` (string): create: An https address the person owns, which answers 2xx quickly. update: see the action

### `organization` (~713 tokens)

Organization and workspace apps

Read-only view of the organization this key or app acts in: the organization (get), its verified domains, SCIM provisioning, one member's sessions, service accounts, and the Slack workspaces, Microsoft Teams tenants and Zapier accounts added to the account (apps). Changes are made in the portal, never here.

Pass action: one of get, domains, scim, member_sessions, service_accounts, apps. Each action takes only its own arguments.
\- get: The organization of the workspace this key or app acts in: its name, your role, its workspaces, verified domains, whether single sign-on is set up or required, whether SCIM provisioning is connected, its sign-in rules, and whether service accounts are available. Needs organization:read. Read-only: changes are made in the portal (Settings, Organization). No other arguments. Read-only; needs organization:read.
\- domains: The email domains the organization has added, each with its state (pending, verified, warning, failed) and the DNS TXT record that proves it. Organization admins only; needs organization:read. Read-only. No other arguments. Read-only; needs organization:read.
\- scim: Whether the organization's identity provider (Okta, Microsoft Entra ID) provisions people through SCIM: the base URL, how many people and groups it has sent, the default role, and its tokens (labels and prefixes, never the tokens). Organization admins only; needs organization:read. Read-only: tokens are made and replaced by a person in the portal. No other arguments. Read-only; needs organization:read.
\- member_sessions: Where one person in the organization is signed in: each live web or app session with how it started (email, passkey, single sign-on…), its country and when it was last used. Organization admins only; needs members:read. Read-only: signing someone out happens in the portal, or with members:write through the API. Arguments: user_id (required). Read-only; needs members:read.
\- service_accounts: The organization's service accounts: machine ide…

Input parameters:

- `action` (string, required): What to do. One of: get, domains, scim, member_sessions, service_accounts, apps. Each action takes its own arguments; see the tool description.
- `user_id` (string): The person's user id (from audit list, actor_id, or the portal's People list). (Used by: member_sessions.)

### `audit` (~559 tokens)

Audit log

Read-only audit log of the organization and its workspaces: list events a page at a time, or export them as JSON lines. Organization admins only. Events never hold secrets, codes or anything that identifies a head.

Pass action: one of list, export. Each action takes only its own arguments.
\- list: Who did what in the organization and its workspaces, newest first: sign-in settings, domains, members, SCIM, keys, asks and exports, each with who did it (a person, a key, a connected app, a service account, SCIM or 50heads). Filter by time, actor, event_action (an audit action or group) and workspace; page with next_cursor. Events never hold secrets, codes or anything that identifies a head. Organization admins only; needs audit:read. Arguments: from, to, actor, event_action, workspace_id, limit, cursor. Read-only; needs audit:read.
\- export: The organization's audit events as JSON lines (one AuditEvent per line, the API's export shape), oldest first, with the same filters as action list. Returns up to max_events lines (default 1,000) and a resume_cursor for the rest. Each export is itself recorded in the audit log. Organization admins only; needs audit:read. Arguments: from, to, actor, event_action, workspace_id, max_events, cursor. Read-only; needs audit:read.

Input parameters:

- `action` (string, required): What to do. One of: list, export. Each action takes its own arguments; see the tool description.
- `actor` (string): A person's user id, a service account id (sa_…), or system for 50heads itself.
- `cursor` (string): list: next_cursor from the previous page. export: resume_cursor from the previous call, or the at|id of the last event you have.
- `event_action` (string): An audit action (domain.added), or a group: organization, domain, member, sso, scim, question, billing, key, audit.
- `from` (string): Events at or after this time (ISO 8601, or a date such as 2026-10-01).
- `limit` (integer): Events per page, 1 to 200 (default 50). Newest first. (Used by: list.)
- `max_events` (integer): Most lines to return (default 1,000). Oldest first; resume with resume_cursor. (Used by: export.)
- `to` (string): Events before this time; a bare date includes that whole day.
- `workspace_id` (string): One of the organization's workspaces.

### `help` (~607 tokens)

Help and feedback

Search the 50heads help center (search), send feedback or a problem to support (feedback), check whether 50heads is working and whether asking is paused (status), or see who this connection acts as, with its scopes, caps and rate limits (whoami). Call whoami first when something is refused, and status when calls fail. search, feedback and status need no sign-in; whoami reads the account.

Pass action: one of search, feedback, status, whoami. Each action takes only its own arguments.
\- search: Searches the 50heads help center (asking, results, credits and billing, verification, the API and MCP) and returns the best articles with links. Use it to answer a person's question about how 50heads works. No sign-in needed. Arguments: query (required), locale, limit. Read-only; no sign-in needed.
\- feedback: Sends feedback or a problem to 50heads support as a ticket; a person replies by email. Use it when something about 50heads or this server did not work, or to suggest something. Signed in, the reply goes to the account's email; otherwise add email. Arguments: message (required), subject, kind, email. Changes something; no sign-in needed.
\- status: Whether 50heads is working right now, and whether asking, answering, MCP asking or buying credits is paused. Check it when calls fail or results stop filling, and do not ask while asking is paused (nothing is charged while paused). No sign-in; costs nothing. No other arguments. Read-only; no sign-in needed.
\- whoami: Who this connection acts as (a person or a service account, email masked), its scopes, its daily and per-question caps and today's spend, the account it spends from (personal or a team, with the role there), the organization where one is switched on, and the rate limits with what is used now. Call it first when something is refused, or before a large batch. Read-only; costs nothing. No other arguments. Read-only; needs account:read.

Input parameters:

- `action` (string, required): What to do. One of: search, feedback, status, whoami. Each action takes its own arguments; see the tool description.
- `email` (string): Only when not signed in, so support can reply. (Used by: feedback.)
- `kind` (string): Default other. (Used by: feedback.)
- `limit` (integer): Default 5. (Used by: search.)
- `locale` (string): Help center language. Default en-gb. (Used by: search.)
- `message` (string): The feedback or problem, in plain words. Leave out personal data about other people. (Used by: feedback.)
- `query` (string): What you want to know, in a few words. (Used by: search.)
- `subject` (string): (Used by: feedback.)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp#diagnostics

## Score history

- 2026-11-05: 86
- 2026-11-04: 85
- 2026-11-03: 85
- 2026-11-02: 84
- 2026-11-01: 84
- 2026-10-31: 84
- 2026-10-30: 83
- 2026-10-29: 83
- 2026-10-28: 82
- 2026-10-27: 82
- 2026-10-26: 81
- 2026-10-25: 81
- 2026-10-24: 80
- 2026-10-23: 80
- 2026-10-22: 79
- 2026-10-21: 76
- 2026-10-20: 81
- 2026-10-19: 81
- 2026-10-18: 81
- 2026-10-17: 81
- 2026-10-16: 81
- 2026-10-15: 81
- 2026-10-14: 81
- 2026-10-13: 38
- 2026-10-12: 49
- 2026-10-09: 49

## Common questions

### What is the 50heads MCP server?

50heads is an MCP server listed in the public MCP registry as com.50heads/mcp. Ask fifty verified people a five-second question and see what they think. This page covers its npm package (@50heads/mcp).

### Is the 50heads MCP server safe to use?

50heads scores 86 out of 100 on VerifyMCP. We recorded 4 known advisories against it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the 50heads MCP server expose?

50heads exposes 9 tools: estimate, ask, results, questions, projects, and 4 more. Their descriptions and schemas cost roughly 7,882 tokens of context every time the server is loaded.

### Is the 50heads MCP server still maintained?

50heads is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the 50heads MCP server under?

50heads declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@50heads/mcp
- Socket report: https://socket.dev/npm/package/@50heads/mcp
- Repository: https://github.com/50heads/mcp
- Website: https://50heads.com/agents
- Changelog RSS feed: https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-50heads-mcp/50heads-mcp
