A side-by-side look at the Human Survey and N8n MCP Community MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Human Survey for workplace & productivity work as a local process; choose N8n MCP Community for workplace & productivity as a local process. You can also run both side by side in one mcpServers block.
HUMANSURVEY_API_KEY.login, get_catalog, list_forms.N8N_API_URL, N8N_API_KEY.n8n_workflows_list, n8n_workflows_get, n8n_workflows_create.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 60/100 · Good | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | API key required |
| Pricing | Not declared | Free |
| Required env vars | HUMANSURVEY_API_KEY | N8N_API_URLN8N_API_KEY |
| Verified owner | Community listing | Community listing |
| GitHub stars | 1 | 2 |
| Directory activity | 2 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 10 | 44 |
| Full listing | View Human Survey | View N8n MCP Community |
loginSign in with an email address and store an API key on this machine. Called with only an email, it mails a six-digit code and returns nothing usable — the code has to come from the person, out of their inbox. Called with the email and that code, it stores a key at ~/.humansurvey/credentials and reports where it was written. The key itself is never printed. Signing in and signing up are the same act: an address that has never been used gets an account.get_catalogList the platforms HumanSurvey knows: the slug to use as catalog_slug, the display label, and which class of channel it is. These are the named channels a respondent can be shown — TikTok, ChatGPT, LinkedIn, Reddit and so on — plus the descriptive options that have no brand behind them, like "a friend or colleague told me". No API key needed.list_formsList the forms on this account: id, name, respondent URL, whether it is active or paused, whether it has been configured with questions yet, and how many responses it has collected.get_formRead one form: its settings, and the question configuration currently shown to respondents — every question, every candidate, and the order mode. Returns the configuration as JSON, because that is the exact shape a configuration write takes.create_formCreate a form and return its id, its respondent URL, and the iframe and postMessage listener to embed that URL in a host page. The form has no questions yet and shows nothing to respondents until it is configured. allowed_origins restricts which sites may embed it; leaving it empty allows any site, which means any site can spend this account’s response quota.configure_formSet the questions and candidates a form shows. Replaces the whole configuration and stores it as a new immutable version, so responses already collected keep describing the list they were actually shown. Re-sending an identical configuration reuses the existing version rather than making another.
A form is one single-select question, optionally expanding into a second. Give a candidate an `expands` naming another question to reveal it when that candidate is picked — that is how "TikTok" becomes "which account".
Candidate ids must be stable keys that survive a rename. Using a handle as an id splits that creator’s history in two the day they change it.
Set catalog_slug to take a candidate’s label and logo from the platform catalog. Order defaults to "rotate", which randomizes per respondent and is what makes the reported shares unbiased; "fixed" keeps your order and accepts that earlier options get picked more often for being earlier.get_attributionWhat respondents said, aggregated. Reports, per question, how many completed responses named each candidate out of how many answered that question, the unresolved answers in the same list, how often a follow-up question failed to find an answer, and revenue where conversion events have been recorded.
Computed fresh on every call, including any mappings made since — so a rollup of a past window can legitimately change between two reads.list_unresolvedThe answers respondents typed instead of picking from the list, grouped by the exact text and ordered by how often it was typed. Reports the spelling variants seen, when each was first and last typed, and whether a mapping already covers it.
These are verbatim words. Two texts that read alike may be different people, and a text may name somebody who is not on the candidate list at all.remapRecord that a specific typed answer means a specific candidate. It applies to every response already carrying that text as well as every future one, so numbers reported for past windows change.
The original text is never altered and a mapping can be revoked, but a report may already have been read. Only map a text whose meaning is established — a text that merely resembles a candidate’s name is not evidence that it is that candidate.
One live mapping per text per question.revoke_remapStop a mapping from applying. The typed answers it covered return to the unresolved list — in past windows as well as future ones, because rollups join mappings when they are read rather than when they are made. Numbers already reported for those windows will therefore change.
Nothing is deleted: the mapping is marked revoked and kept, so a report produced while it was live can still be explained. Revoking an already-revoked mapping is not an error and does not move the time it stopped applying.
Mapping ids appear beside any text that is already mapped in the free-text listing, and in the confirmation given when a mapping is created.n8n_workflows_listList one Public API page of workflows visible to the configured API key. Use n8n_search_workflows for substring matching or n8n_workflows_get for a known ID. Omit cursor for page one. active, tags, and name are combined upstream; keep those filters and excludePinnedData unchanged when passing nextCursor. limit sizes only that page, and the tool never auto-paginates. Requires workflow-list permission; returns projected workflows and nextCursor, never pin/static values.n8n_workflows_getGet one current workflow for inspection or reviewed editing. workflowId is the stable ID returned by n8n_workflows_list or create, not a workflow name or version ID. Use n8n_workflows_get_version for history. excludePinnedData changes only the upstream request and the pinDataPresent/staticDataPresent flags; pinned values are withheld whether true or false. Requires permission to read the target; returns structure, state, settings, and presence flags.n8n_workflows_createCreate and persist one workflow as an additive write without activating its triggers. name, nodes, and connections define a new record; nodes and connections must form one complete graph, while omitting settings uses an empty object. Optional pinData, staticData, description, and nodeGroups are forwarded only when supplied. Use n8n_workflows_update for an existing workflow and activate for triggers. Requires write or unsafe mode plus create permission; returns the validated projection without pin/static values.n8n_workflows_updateUpdate selected top-level fields through a non-atomic full PUT. workflowId selects the current record; copy expectedVersionId from its latest read, and supply at least one writable field. The version must match both pre-write reads. Omitted fields are preserved, but each supplied array or object replaces that whole field. Use n8n_update_node for one node property and n8n_workflows_update_tags for tags. Requires write/unsafe mode plus read and update permission; returns the confirmed projection.n8n_update_nodeUpdate one path on one node while preserving sibling data. workflowId selects the current workflow, nodeId selects exactly one node inside it, and path selects the mutable field whose contract validates value. Copy expectedVersionId from the latest workflow read and set acknowledgeNonAtomicRisk=true; both guards are required before the full PUT. Use n8n_workflows_update for top-level or multi-node edits. Requires write/unsafe mode plus read and update permission; returns the changed path and residual race risk.n8n_workflows_deletePermanently delete one workflow and its saved definition. workflowId must be the current stable ID from n8n_workflows_list or get; a name or version ID is not accepted. Use n8n_workflows_archive for reversible removal and n8n_workflows_get for inspection. This action has no rollback or transfer. Requires unsafe mode plus delete permission; returns the request-bound workflowId with deleted=true.n8n_workflows_activateActivate one workflow so production triggers can accept future events; this does not execute it now. workflowId must be the current stable ID from n8n_workflows_list or get, not a name or version ID. Review the workflow first; use n8n_workflows_deactivate to stop future triggers. Requires unsafe mode plus activation permission; returns target-validated active state metadata.n8n_workflows_deactivateDeactivate one workflow's future production triggers without deleting saved data or stopping runs already in progress. workflowId must be the current stable ID from n8n_workflows_list or get, not a name or version ID. Use n8n_workflows_activate to reverse the state or archive for lifecycle removal. Requires unsafe mode plus deactivation permission; returns target-validated inactive state metadata.n8n_workflows_get_versionGet one retained workflow snapshot. workflowId is the stable workflow ID; versionId is that workflow's separate retained-version ID. Do not swap them or pass a workflow name. Use n8n_workflows_get for current state or n8n_workflows_diff for comparison. Both returned IDs must match the selectors; a missing endpoint and a pruned version share an explicit ambiguous 404 outcome. Requires history-read permission; returns validated nodes and connections subject to retention.n8n_workflows_get_tagsList tags currently assigned to one workflow. workflowId selects the workflow from n8n_workflows_list or get; it is not a tag ID and this call does not list unassigned tags. Use it before n8n_workflows_update_tags when assignments must be preserved; use n8n_tags_list for all tags. The endpoint has no cursor, so the tool keeps at most 100 records and reports exact omissions. Requires assignment-read permission; returns validated tag metadata.n8n_workflows_update_tagsReplace one workflow's complete tag assignment; this is not a merge. workflowId selects the workflow, while every tagIds item must be a stable tag ID from n8n_tags_list or get; tag names are not accepted. tagIds is the whole desired set, so omitted IDs are removed and [] clears all tags. Use n8n_workflows_get_tags first to preserve assignments. Requires write/unsafe mode plus assignment permission; returns n8n's validated replacement.n8n_workflows_archiveArchive one workflow without deleting its saved definition. workflowId must be the current stable ID from n8n_workflows_list or get, not a name or version ID. Use this instead of delete for reversible removal; use deactivate only to stop triggers. The availability change can disrupt callers. Requires unsafe mode plus archive permission; returns target-validated metadata with isArchived=true.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"sunsiyuan-human-survey": {
"command": "npx",
"args": [
"-y",
"humansurvey-mcp"
],
"env": {
"HUMANSURVEY_API_KEY": "YOUR_HUMANSURVEY_API_KEY_HERE"
}
}
}
}
{
"mcpServers": {
"drzamarian-n8n-mcp-community": {
"command": "npx",
"args": [
"--yes",
"n8n-mcp-community@latest"
],
"env": {
"N8N_API_URL": "YOUR_N8N_API_URL_HERE",
"N8N_API_KEY": "YOUR_N8N_API_KEY_HERE"
}
}
}
}