Human Survey

io.github.sunsiyuan由 GitHub 帳號 sunsiyuan 發布v1.2.0更新於 Oct 24, 2026

Self-reported attribution: which channel and which creator your users first heard you from.

發布方自己的服務:TAP

已驗證STDIO僅桌面資料與分析商業與電商

概覽

AI 產生的概覽

HumanSurvey 的 MCP 伺服器,讓助理設定「你是怎麼知道我們的」歸因表單,並讀回回答與彙總資料。

可以做什麼
  • 建立並設定歸因表單,平台選項取自目錄,創作者選項由呼叫端提供
  • 讀回結果:依選項與日期範圍的彙總、原始回答串流,以及等待對應的自由文字
  • 透過重新對應回溯處理尚未解析的自由文字回答
  • 用同一個 external_id 鍵把回答與自有使用者及營收串接
適用情境
適合想讓助理在註冊或付款流程中建立並維護一題自述歸因問題,並把頻道與創作者結果取回自有分析、而不依賴人工儀表板的情境。
執行需求
透過 npx 從 npm 套件 humansurvey-mcp 在本機執行(需要 Node.js)。需要 HumanSurvey 帳號,並以環境變數 HUMANSURVEY_API_KEY 提供 API 金鑰;需要連線至 HumanSurvey API 的網路。僅限桌面端。
安裝前請注意
API 金鑰(HUMANSURVEY_API_KEY)可存取帳號下的表單與回答資料,請勿放入共用設定。助理可建立與重新設定表單並寫入重新對應,因而改變已存回答的讀取方式;設定變更以不可變快照保存。受訪者回答與你的外部使用者 ID 會傳送到 HumanSurvey 的伺服器。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Human Survey,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

HumanSurvey

Website: humansurvey.co · Docs: humansurvey.co/docs · FAQ: humansurvey.co/faq

[human-survey MCP server]

Attribution for the channels that have no referrer.

HumanSurvey asks one question — how did you hear about us — inside the host's own signup or payment flow, at a granularity that is actually actionable: the platform first, then which creator, podcast, event or store.

text
Agent configures a form   → platforms from the catalog, creators supplied by the callerHost embeds /s/{id}       → in its signup flow, its payment flow, or bothRespondent answers        → picks a platform; that pick expands the follow-up in placeHost pushes conversions   → POST /api/attribution/events, keyed on its own user idAgent reads back          → rollup, raw response stream, free text awaiting a mapping

What is this?

An API and MCP server for self-reported attribution. TikTok in-app, Instagram, podcasts, communities, word of mouth, AI assistants: the exposure happens where tracking cannot reach, and asking a human is the only always-on signal that survives every referrer leak.

Two placements answer different questions. In the payment flow, the respondent is already a paying customer, so the answer joins to revenue with no conversion ingest at all. In the signup flow, it is the only way to see the people a channel sends who never pay. Divide a channel's share of the paying population by its share of the signup population. Above 1 it converts better than your average, below 1 worse. Multiply that ratio by your overall signup-to-paid rate to get the channel's own rate.

It is designed for:

  • hosts embedding a form in their own onboarding or checkout
  • agents that keep the candidate list current and read the results back

It is not designed for:

  • general-purpose surveys — arbitrary question types, Markdown authoring and conditional logic were removed in the attribution pivot
  • a human-facing analytics dashboard: the aggregates are an API resource, and the agent is the dashboard
  • reaching your audience for you — HumanSurvey never contacts respondents; the transports it offers (the /s/{id} URL and the iframe embed) are ones you control

Features

  • Progressive disclosure, not pagination — POST the platform answer, PATCH the follow-up. The first answer is durable before the second is asked, and a respondent who abandons the follow-up is still real data.
  • Rotation by default — the orderable candidates are permuted per respondent, seeded by a client-minted render_id, so the raw share is unbiased by construction. fixed order exists for callers who want it and does not hide its bias.
  • Retroactive remapping — free text is stored verbatim and resolved against the remap table on every read, so one mapping fixes months of history with no backfill.
  • Immutable config snapshots — a response is joined to the version it was rendered against, so reconfiguring cannot rewrite what history says was shown.
  • One join key, both directions — external_id brings revenue in and carries per-user attribution back out to your own user table.
  • Cursor reads — a response becomes visible once it is complete, is emitted exactly once, and is final when emitted. Nothing downstream has to upsert.

Product Principles

  • AI-first I/O: agents configure the form and consume the results; humans are in the middle.
  • Everything is an API: creator functionality must be available over authenticated HTTP and MCP.
  • Narrow scope wins: one question, asked well. A feature that mainly serves a human survey operator probably does not belong here.
  • No confident percentages: every number ships beside the denominator it was computed over, and a number we cannot compute honestly is null rather than smoothed.

Quick Start

Get an API key

bash
curl -X POST https://www.humansurvey.co/api/auth/code \  -H "Content-Type: application/json" \  -d '{ "email": "[email protected]" }'
curl -X POST https://www.humansurvey.co/api/auth/verify \  -H "Content-Type: application/json" \  -d '{ "email": "[email protected]", "code": "481920", "grant": "api_key" }'

Anonymous key creation is gone. Every key belongs to an account from birth, which is what gives a lost key a recovery path and makes rotation free.

Create a form, then configure it

bash
curl -X POST https://www.humansurvey.co/api/attribution/forms \  -H "Authorization: Bearer hs_sk_..." \  -H "Content-Type: application/json" \  -d '{    "name": "Checkout — how did you hear about us",    "allowed_origins": ["https://app.example.com"]  }'
json
{  "id": "abc123efgh45",  "form_url": "https://www.humansurvey.co/s/abc123efgh45",  "warnings": ["this form has no config yet; PUT /api/attribution/forms/abc123efgh45 with {nodes} before embedding it"]}

A form renders nothing until it has a config. PUT stores one as an immutable snapshot:

bash
curl -X PUT https://www.humansurvey.co/api/attribution/forms/abc123efgh45 \  -H "Authorization: Bearer hs_sk_..." \  -H "Content-Type: application/json" \  -d '{    "nodes": [      {        "id": "channel",        "prompt": "Where did you first hear about us?",        "candidates": [          { "id": "tiktok", "catalog_slug": "tiktok", "expands": "creator" },          { "id": "reddit", "catalog_slug": "reddit" },          { "id": "friend", "label": "A friend or colleague" },          { "id": "dunno", "label": "I don'\''t remember", "pinned": "end", "dont_remember": true }        ]      },      {        "id": "creator",        "prompt": "Which account was it?",        "candidates": [          { "id": "oecuid_8812", "label": "Jade", "handle": "@jade.work0" }        ]      }    ]  }'

Platform labels, marks and aliases come from GET /api/attribution/catalog and are copied into the snapshot. Creator candidates are yours: the product renders a candidate set and returns the id that was chosen, and matching a vague description against a creator database is upstream work.

Read the results

bash
curl "https://www.humansurvey.co/api/attribution/rollup?form_id=abc123efgh45&by=candidate&from=2026-07-01&to=2026-08-01" \  -H "Authorization: Bearer hs_sk_..."

Also on the read side: GET /api/attribution/forms/{id}/responses (cursor stream, or one identity via ?external_id=), .../unresolved for free text awaiting a mapping, and POST .../remaps to resolve it retroactively. Full request and response shapes are in the OpenAPI document.

Use with Claude Code

json
{  "mcpServers": {    "survey": {      "command": "npx",      "args": ["-y", "humansurvey-mcp"],      "env": {        "HUMANSURVEY_API_KEY": "hs_sk_your_key_here"      }    }  }}

The server name stays survey and the package stays humansurvey-mcp — both sit inside every existing user's config. Its ten tools now speak the attribution API — see packages/mcp-server/README.md. npm publishes separately from this repo, so the version on npm can lag what is here.

Public Surface

  • Docs page: https://www.humansurvey.co/docs
  • OpenAPI: https://www.humansurvey.co/api/openapi.json
  • AI index: https://www.humansurvey.co/llms.txt

Tech Stack

ComponentTechnology
FrameworkNext.js (App Router)
DatabaseNeon (serverless Postgres)
FrontendReact + Tailwind CSS
MCP Server@modelcontextprotocol/sdk
DeploymentVercel

Project Structure

├── apps/web/            # Next.js app (API + respondent page + site)│   ├── lib/attribution/ # config, responses, reads, rollup, remap│   └── supabase/migrations/  # applied through scripts/migrate.sh, with a ledger├── packages/mcp-server/ # MCP server for Claude Code└── docs/                # architecture, roadmap, design docs

Contributing

Read CONTRIBUTING.md before opening a PR. The most important rule is scope discipline: new UI variants, analytics dashboards, and human-operator features are usually out of scope.

Development

bash
pnpm installpnpm dev               # Start Next.js dev serverpnpm test              # node --test over apps/web/lib/**/*.test.tspnpm build             # Build all packages

License

MIT

來源:README.md,提交 5ad9b11

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.2.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Human 整合