Overview
The Retently MCP server lets an AI client such as Claude work directly with your Retently account in natural language. Ask for your latest NPS, search and tag feedback, reply to detractors, send a transactional survey, or pull a monthly report, without leaving the chat.
It implements the Model Context Protocol over Streamable HTTP, so any MCP-capable client can connect to it as a remote server. There is nothing to install and nothing to host on your side.
- Endpoint
- https://mcp.retently.com/mcp
- Transport
- MCP Streamable HTTP (POST to the endpoint)
- Authentication
- OAuth (recommended) or a personal access token
- Tools
- 66 tools: 52 read, 13 write, and 1 connection check
What you need
- A Retently account you can log in to.
- An AI client that supports remote MCP servers, such as Claude, Codex, or ChatGPT, with its connector feature enabled.
- Tools act on your account and respect your Retently role and permissions, so you only ever see and change what your account allows. Some tools also depend on your plan and account type: Products tools need an ecommerce account, Companies tools need B2B Account-CX, and topic analytics tools need Topics.
Setup walkthroughs
Prefer to watch? These short videos walk through connecting the Retently MCP server end to end in two popular clients. Each one links to the full written guide if you would rather follow along in text.
Claude Cowork
Connect your Retently account to Claude Cowork and run your first query.
Full step-by-step guideOpenAI Codex
Add the Retently MCP server to OpenAI Codex and start working with your data.
Full step-by-step guideConnect with OAuth (recommended)
With OAuth there is no token to generate. You log in once in the browser and approve the access you want. After that the client keeps itself connected in the background, so you never paste a credential. This is the best option for interactive clients.
Claude Code
Add the server, then trigger the login from the REPL:
claude mcp add --transport http retently https://mcp.retently.com/mcpIn the Claude Code REPL, run /mcp. Your browser opens to Retently, you log in and approve the requested access, and Claude Code stores and renews the session for you. claude mcp list then shows retently as connected.
claude.ai (web)
Go to Settings, then Connectors, then Add custom connector. Name it Retently and use the URL https://mcp.retently.com/mcp. The web app runs the login and approval for you. On the web this is the only connection method, since there is no place to paste a token.
Claude Desktop
Add it as a remote connector under Settings, then Connectors, using the same URL. It runs the same browser login. Restart the app fully after adding it.
Connect with a personal access token
A personal access token (PAT) is a long-lived bearer token you generate and paste into a client. Use it for scripts, headless automation, or any client where you want a token you control by hand.
1. Create the token
- Log in to app.retently.com.
- Open Settings, then AI Connections.
- Create a personal access token, choose its scopes (see Scopes and PII), and set an expiry. The default is 90 days and the maximum is 365 days.
- Copy the token right away. It is shown only once. If you lose it, delete it on the same page and create a new one.
The token looks like this:
rtly_mcp_pat_<id>_<secret>2. Add it to your client
Claude Code:
claude mcp add --transport http \
retently https://mcp.retently.com/mcp \
--header "Authorization: Bearer rtly_mcp_pat_<id>_<secret>"Claude Desktop, by editing the config file and then restarting the app fully:
{
"mcpServers": {
"retently": {
"type": "http",
"url": "https://mcp.retently.com/mcp",
"headers": { "Authorization": "Bearer ${RETENTLY_MCP_PAT}" }
}
}
}Keep the token out of the file by setting it as an environment variable, for example export RETENTLY_MCP_PAT="rtly_mcp_pat_...". On the claude.ai web app there is no place to paste a token, so use OAuth there.
Scopes and PII
Each connection holds a set of scopes that decide what it can do. Grant the least you need. What you can grant is capped by your Retently role.
feedback:readfeedback:tagfeedback:topicfeedback:curatefeedback:deletefeedback:replyfeedback:importcustomers:readcustomers:writecampaigns:readcampaigns:writereports:readreports:generatesurveys:sendsuppressions:readsuppressions:writetemplates:readoutbox:readoutbox:writeintegrations:readteam:readpii:readpii:writeCustomer personal data, including emails, names, custom properties, location, and reply identity, is gated separately by the pii:read and pii:write scopes. These are admin controlled and off by default. Without pii:read, most read tools still work but omit personal fields, while tools whose whole result is personal data, such as the suppressed email list, are not available. Without pii:write, tools that write personal data, such as send_survey, create_customer, and update_customer, are not allowed. An administrator enables them under Customer PII access on the same AI Connections page.
Reading topic analytics uses reports:read. Calling generate_topic_drivers additionally requires reports:generate, because it can create a paid AI report. The read-only get_topic_analysis tool never starts a generation and omits verbatim citation comments; retrieve the underlying source comments with list_topic_feedback and feedback:read.
Tool catalog
66 tools grouped by area. Read tools never change anything. Write tools change data and follow the safety flow described below. Your AI client discovers the tools and their arguments automatically once connected; which tools appear depends on your plan, permissions, and account type.
Feedback
list_feedback | read | List recent feedback with scores, comments, tags, topics, campaign details, and Shopify order details for ecommerce accounts. Customer identity, custom properties, assignee names, and shipping addresses require pii:read. |
list_recent_feedback | read | List the most recent feedback, optionally within the last N days, with historical customer tags. This lean feed does not include customer custom properties. |
get_feedback | read | Get one feedback response with its survey answers, tags, topics and sentiment, campaign details, and Shopify order details for ecommerce accounts. Customer identity, custom properties, assignee names, and shipping addresses require pii:read. |
get_feedback_replies | read | Get the reply thread for a feedback record, oldest first, with a last-reply summary. Sender identity needs pii:read. |
search_feedback | read | Search feedback by comment text, campaign, metric, or score range, with Shopify order details for ecommerce accounts. Customer identity, custom properties, assignee names, and shipping addresses require pii:read. |
aggregate_feedback | read | Aggregate counts and average score grouped by campaign, metric, channel, score, topic, tag, or company. Returns a mean, not a true score; use get_score for NPS, CSAT, or CES. |
list_feedback_statuses | read | List the account's custom feedback workflow statuses. |
tag_feedback | write | Add or remove tags on a feedback response. |
set_feedback_topics | write | Replace the full set of topics on a feedback response. |
star_feedback | write | Star or unstar a feedback response for follow-up. |
assign_feedback_user | write | Assign a feedback response to a team member, or unassign it. |
resolve_feedback | write | Resolve or reopen a feedback response, or set its custom status. |
add_feedback_note | write | Append an internal note to a feedback response. |
reply_feedback | write | Send a reply email to the customer who left a feedback response. |
import_feedback | write | Import a batch of historical or external feedback into a campaign, creating customers as needed and de-duplicating by email. Imported responses do not trigger survey sends, reminders, or webhooks. |
Filters
describe_filters | read | Describe the account's feedback filter vocabulary, used to build a filter spec. |
apply_feedback_filter | read | Apply a filter spec to account feedback and return rows or an aggregate. Rows carry the campaign name, lifecycle status and rating category, and a privacy-safe verification summary; the send-time customer identity and assignee name need pii:read, and ecommerce rows include structured Shopify order attributes (shipping address needs pii:read). |
list_saved_filters | read | List the account's named saved filters, each replayable with apply_feedback_filter. |
list_recent_filters | read | List your recently applied feedback filters, each replayable with apply_feedback_filter. |
Products
Available only on ecommerce accounts.
list_products | read | Rank your products by customer feedback, with score, change against the previous period, response counts, and the top complaint topic for each product. Products with limited feedback are shown separately from ranked results, with a low-confidence score or no score when there is too little evidence. |
get_product_analysis | read | Compare a product's score, response volume, negative rate, and repeat-buyer rate with the previous period and your store average, and explore its complaint topics, customer and order breakdowns, and products bought together. Scores, rates, or comparisons may be unavailable when there is too little feedback. |
get_product_trend | read | Get one product's negative-rate trend over time against a rolling baseline, with spikes flagged. |
list_product_feedback | read | List the survey responses that mention one product, with score, comment, sentiment, campaign, and order attributes. Customer identity and shipping location need pii:read. |
Reports and scores
Topic analytics tools, including topic movers, are available on accounts with the Topics feature.
get_score | read | Get the true NPS, CSAT, or CES for the whole account or a segment (by customer attributes, tags, campaign, or feedback), over an optional date window. |
get_monthly_stats | read | Get a metric's monthly time series over the last 12 months. |
get_geo_stats | read | Get scores and response counts by country, or by state within one country, counting each person once and showing the most-mentioned topic when enough responses mention it. Locations with fewer than 5 responses are grouped into Other. |
get_topic_stats | read | Get per-topic volume, sentiment split, and period-over-period change. |
get_topic_movers | read | Rank topics by how much their impact on your score changed against the previous period of the same length, where both periods have enough feedback. When there is no earlier feedback to compare, it shows the topics with the largest current impact instead. |
get_topic_analysis | read | Get one topic's KPI deltas, coverage, and score-band, campaign, segment, related-topic, and ecommerce product breakdowns. Includes an existing AI driver summary for the selected filters when available, without generating a new one; use list_topic_feedback for source comments. |
get_topic_trend | read | Get one topic's daily response counts, mentions, sentiment, scores, mention share, and 56-day rolling baseline. Request a date range of 120 days or less. |
list_topic_feedback | read | Page through the feedback that mentions a topic, sorted by recency, negative sentiment, or severity. Requires feedback:read; customer identity and arbitrary personal properties still require pii:read. |
generate_topic_drivers | write | Generate or retrieve an AI report explaining what is driving a topic for your selected filters. Generating a report requires reports:generate and confirmation after a preview. |
get_campaign_report | read | Get delivery stats, score trend, and per-question stats for one campaign or all campaigns, optionally scoped to a date window. The all-campaigns case is paginated and reports the total, so you can page through every campaign and know the coverage. |
get_trends | read | List the account's trend groups (name, metric, default flag, item count). |
get_trend_items | read | Get one trend group with its scored items: per item the current, previous, and change score, promoter, passive, and detractor counts, and time-series points. By id, or the default group, over an optional date range. |
Customers
list_customers | read | List customers, newest first, with tags, source, subscription status, last survey sent, integration list membership, and risk and deliverability flags. Email, name, job title, phone number, custom properties, and location require pii:read. |
search_customers | read | Search customers by company, tag, custom attribute, or name and email (searching by name or email needs pii:read). Returns tags, source, status, last survey sent, integration list membership, and risk and deliverability flags; email, name, job title, phone number, custom properties, and location require pii:read. |
get_customer | read | Get one customer by id, with tags, source, subscription status, last survey sent, integration list membership, and risk and deliverability flags. Email, name, job title, phone number, custom properties, and location require pii:read. |
create_customer | write | Create a new contact with email, profile fields, tags, and custom properties. Email is unique per account, so it never overwrites an existing contact. Needs pii:write. |
update_customer | write | Update a contact's profile fields, tags, and custom properties. Partial update, so only the fields you pass change. Needs pii:write. |
unsubscribe_customer | write | Opt a contact out of survey emails. Idempotent, so a contact who is already opted out is left unchanged. Needs pii:write. |
Companies
Available on accounts with the B2B Account-CX feature.
list_companies | read | List companies with firmographics, contact count, and per-metric CX scores (NPS, CSAT, XSAT, CES, Star), each null when there is no data. |
get_company | read | Get one company by id, with firmographics, contact count, and per-metric CX scores (NPS, CSAT, XSAT, CES, Star), each null when there is no data. |
Campaigns
list_campaigns | read | List the account's campaigns (name, metric, enabled and default state). |
search_campaigns | read | Search campaigns by name, metric, and enabled state. |
get_campaign | read | Get one campaign by id, with its config and latest aggregate score. |
Surveys
send_survey | write | Queue a transactional survey to a list of recipients through an active campaign. Sends live. |
Templates
list_survey_templates | read | List survey templates (name, metric, channel, subject). |
search_survey_templates | read | Search survey templates by name, metric, and channel. |
Digests
list_digests | read | List generated digest reports, newest first, with scores and report links. |
get_digest | read | Get one digest report by id: scores, deltas, themes, AI summary, and HTML and PDF links. Detractor comments and customer identity need pii:read. |
Delivery and queue
list_outbox | read | List outbound surveys with delivery state (opened, responded, bounced), campaign and company, tags, and a cross-reference to the feedback response id (which resolves only to live, non-deleted feedback). Recipient name and email, additional recipients, and the snapshot custom properties need pii:read. |
get_outbox_stats | read | Get delivery totals (sent, opened, responded, bounced, opted out). |
get_queue_status | read | Get the transactional-survey queue depth. |
Suppressions
list_suppressed_domains | read | List suppressed email domains and patterns. |
list_suppressed_emails | read | List suppressed email addresses. Needs suppressions:read and pii:read. |
get_suppressed_email | read | Get one suppressed email record. Needs suppressions:read and pii:read. |
Integrations
list_integrations | read | List integrations with connection state and health. No credentials are returned. |
get_integration_status | read | Get one integration's health and last-sync state. No credentials are returned. |
Team
list_account_users | read | List team members with roles and status. Email and name need pii:read. |
get_account_user | read | Get one team member by id, with roles and status. Email and name need pii:read. |
Account
get_account_plan_usage | read | Get the account plan with usage versus limits per metered dimension. |
list_account_attributes | read | List the account's custom contact-attribute schema. |
list_customer_tags | read | List the customer tags in use on the account. |
list_feedback_topics | read | List the feedback topics defined for the account. |
Server
ping | meta | Liveness probe. Returns pong and a server timestamp. No auth required. |
Prompts
Prompts are ready-made starting points for common feedback reviews. Claude Code shows them as slash commands. Other clients may not display them, so you can also ask the same questions in your own words.
summarize-detractors | Summarize recent detractor feedback. |
nps-delta-since | Compare your score across two time periods. |
draft-feedback-reply | Draft a reply to a feedback response for you to review. |
nps-for-segment | Get NPS, CSAT, or CES for a customer or feedback segment. |
compare-segments | Compare scores between two segments. |
top-topics-weekly-digest | Summarize the week's most-discussed feedback topics. |
weekly-cx-review | Review score changes, new detractor themes, and what is still open. |
maintenance-feedback-review | Review maintenance and repair feedback, resolved versus still open. Property management accounts only. |
product-complaints | Find the products customers complain about most, and why. Ecommerce accounts only. |
accounts-at-risk | Review customer companies showing signs of churn risk in their feedback and scores. Accounts with B2B Account-CX only. |
Write safety
Every write tool runs as a dry run first. It returns a preview of exactly what would change plus a confirmation token, and changes nothing until the client calls it again with that token. Write actions are rate limited per account and recorded in an audit log.
send_surveysends real surveys to real customers once confirmed. Use a test contact while you are trying it out. Suppressed addresses are dropped automatically.reply_feedbacksends a real email to the customer. Sending cannot be undone.generate_topic_driverscan generate and save an AI report after confirmation, or return an existing report without generating another. Generation needs enough feedback on the topic and is limited to 50 reports per account per day, with a 24-hour cooldown for forced regeneration.
Verify it works
- In Claude Code,
/mcpshould showretentlyconnected with a tool count above zero. - Ask the client to call
ping. It returns{ "pong": true }and proves the connection is reachable, even without a valid credential. - Ask for your most recent feedback or your NPS score. If nothing matches, the response includes the date range your feedback covers and the tools to try next.
The same check from the command line with a token:
curl -s https://mcp.retently.com/mcp \
-H "Authorization: Bearer rtly_mcp_pat_<id>_<secret>" \
-H "Content-Type: application/json" \
-H "Accept: application/json,text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_score","arguments":{}}}'Troubleshooting
| Symptom | What to do |
|---|---|
| The browser login never opens | In Claude Code, run /mcp to start the flow, and make sure you added the server without an Authorization header. On the web, use the Connectors screen, which drives the login for you. |
| Every data tool says it is not authenticated | The login did not complete, or the token is missing, expired, or sent incorrectly. Log in again, or create a new token and check the header is Authorization: Bearer <token>. |
ping works but reads do not | The server is reachable, but ping does not check account access. Read the failing tool's message: if it says you are not authenticated, re-authenticate with OAuth or create a new token; otherwise see the rows below. |
| A tool returns a permission error | Your connection is missing that scope, or your role or PII settings do not allow it. Add the scope when you create the token, or ask an administrator. |
| Could not verify the plan entitlement for this tool | A temporary problem on our side, not a missing feature. Retry in a moment, and contact Retently support if it persists. |
| Your plan does not include the feature this tool requires | Companies tools need B2B Account-CX, and topic analytics tools need Topics. Ask an administrator to check your plan, or contact Retently support if it already includes the feature. |
| Products tools are available for ecommerce accounts only | On other accounts, use the feedback and report tools instead. Contact Retently support if your ecommerce account sees this message. |
| No tools appear after connecting | Restart the client. Claude Desktop needs a full restart. |
Looking for the REST API instead? See the Retently API reference.