Zigpoll MCP server for AI agents

Live

BEARER TOKEN

CUSTOMER SURVEYS

Marketing

Zigpoll gives your agent customer survey operations: create polls and questions, send email and SMS survey invitations, read responses and participants, and analyze trends, revenue attribution, and AI insights.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Zigpoll
agent · Acme Q3
Run
What did customers say in the post-purchase survey this week?
S
zigpoll_list_responses
116ms
Survey agent
212 customers answered this week. The most common answer to 'What almost stopped you?' was shipping cost.
Sources: 1 poll, 212 responses
zigpoll
212 responses
18:29
Message Claude...

Tools your survey agent reaches for on Zigpoll, scoped per user.

CALL ANY TOOL
27 tools for customer surveys in Zigpoll: create and update polls and slides, send email and SMS invitations, and read responses, participants, trends, and insights.
zigpoll_create_poll
Create poll
Create a new poll (survey) under an account you own. Returns the created poll with its id; it starts hidden (isVisible false) and with no slides. Follow with zigpoll_create_slide to add questions, then zigpoll_update_poll with isVisible true to publish.
Parameters
Name
Type
Required
Description
accountId
string
Required
ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts).
title
string
Required
Title of the new poll, for example 'Post-Purchase Feedback'.
displaySettings
object
Optional
Visual display settings object (colors, fonts, position, shape), for example {"backgroundColor": "#212a2f", "align": "right"}.
emailDisplaySettings
object
Optional
Email delivery display settings object (subject, colors, content), for example {"subject": "Have a minute for a quick survey?"}.
pageDisplaySettings
object
Optional
Standalone page display settings object (colors, fonts, layout).
pageExcludeRules
array
Optional
URL path rules for where the poll must not appear, as a list of strings.
pageRules
array
Optional
URL path rules for where the poll appears, as a list of strings, for example ["/thank-you"]. Shopify surfaces use fixed paths such as /(.*)/thank_you (Thank You page), /:order_number/orders/:variable (Order Status) and /account (customer accounts).
schedule
object
Optional
Activation and deactivation schedule, either immediate or scheduled with ISO dates, as a JSON object.
settings
object
Optional
Poll settings object, for example {"showCounter": true, "allowResubmissions": false, "notifyOnComplete": true}. On update it replaces the entire settings object, so send the full object.
smsDisplaySettings
object
Optional
SMS delivery settings object, for example {"message": "We want your feedback! Click the link to complete our survey."}.
targetingSettings
object
Optional
Audience targeting by percentage, geography, browser, device type, referral, IP or metadata, as a JSON object.
visibilitySettings
object
Optional
Auto-open, exit-intent and hide-after rules, for example {"autoOpenDevice": false, "hideAfterSubmission": false}. On update these are merged with existing values, so partial objects are fine.
zigpoll_create_slide
Create slide
zigpoll_generate_survey_link
Generate survey link
zigpoll_get_account
Get account
zigpoll_get_current_user
Get current user
zigpoll_get_poll
Get poll
zigpoll_get_poll_action_logic
Get poll action logic
zigpoll_get_poll_attribution
Get poll attribution
zigpoll_get_poll_devices
Get poll devices
zigpoll_get_poll_locations
Get poll locations
zigpoll_get_poll_metadata
Get poll metadata
zigpoll_get_poll_patterns
Get poll patterns
zigpoll_get_poll_translations
Get poll translations
zigpoll_get_poll_trends
Get poll trends
zigpoll_get_slide
Get slide
zigpoll_list_accounts
List accounts
zigpoll_list_emails
List emails
zigpoll_list_insights
List insights
zigpoll_list_participants
List participants
zigpoll_list_polls
List polls
zigpoll_list_responses
List responses
zigpoll_list_slides
List slides
zigpoll_reorder_slides
Reorder slides
zigpoll_send_email
Send email
zigpoll_send_sms
Send sms
zigpoll_update_poll
Update poll
zigpoll_update_slide
Update slide
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Zigpoll tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zigpoll"], toolNames: [
    "zigpoll_list_polls",
    "zigpoll_list_responses",
    "zigpoll_list_insights"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Summarize this week's responses and insights for the post-purchase survey" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zigpoll"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Summarize this week's responses and insights for the post-purchase survey" }],
  tools,
});

// Execute the tool call with the user's vaulted Zigpoll access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zigpoll"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Summarize this week's responses and insights for the post-purchase survey" }],
  tools,
});

// Tool call runs with the user's vaulted Zigpoll access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zigpoll"] }, pageSize: 100,
});

const agent = new Agent({
  name: "survey_agent",
  model: "gemini-2.5-pro",
  instruction: "Zigpoll tools scoped to this user",
  tools,
});

await agent.run("Summarize this week's responses and insights for the post-purchase survey");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Zigpoll tool. Click to copy, paste into your agent, done.
Surveys
Copy the prompt
Copied
Create a post-purchase survey for the Acme store.
Copy the prompt
Copied
Add a question asking how customers heard about us.
Copy the prompt
Copied
Move the NPS question to the top of the survey.
Responses
Copy the prompt
Copied
List responses to the post-purchase survey from this week.
Copy the prompt
Copied
Show response volume over the last 30 days.
Copy the prompt
Copied
Which AI insights did Zigpoll find for the checkout survey?
Invitations and attribution
Copy the prompt
Copied
Email the NPS survey to these 20 customers.
Copy the prompt
Copied
Text the feedback survey to these 5 phone numbers.
Copy the prompt
Copied
How much revenue came from customers who heard about us on podcasts?
SEE HOW AUTH WORKS
Each user connects their own Zigpoll access token once, and Scalekit sends it with every call. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Zigpoll
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Zigpoll
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Zigpoll
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Zigpoll
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other survey and marketing connectors.
Support and Ops Teams
Freshdesk CSAT agent
Watches Freshdesk for resolved tickets, emails each requester a CSAT survey from Gmail, and writes the score and the verbatim back onto the ticket, every call on the support rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other survey and marketing connectors.
SUPPORT
Freshdesk CSAT follow-up agent
Spot resolved Freshdesk tickets, email the CSAT survey from Gmail, and write the score back onto the ticket.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Zigpoll access token looks fine in a demo. In production every survey change and invitation looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Zigpoll today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Zigpoll as the user or through a shared token?
As the user. Each user connects their own Zigpoll access token once, and Scalekit sends it with every call. Audit logs attribute every survey change and invitation to that user, not a shared service account.
Where is the Zigpoll access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Zigpoll?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the response and insight tools without zigpoll_send_email or zigpoll_send_sms, which send survey invitations to customers. No Zigpoll tool deletes data. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Zigpoll access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Zigpoll accounts can the agent reach?
Every account the user's access token can reach. zigpoll_list_accounts returns them, and the response, participant, and insight tools take an account, poll, or slide to scope the data.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""zigpoll"": {
""url"": ""https://mcp.scalekit.com/zigpoll"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.zigpoll]
url = ""https://mcp.scalekit.com/zigpoll""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""zigpoll"": {
""url"": ""https://mcp.scalekit.com/zigpoll"",
""type"": ""http""
}
}
}