Retently MCP Server

Connect Retently to Claude and other AI clients· Back to retently.com

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
55 tools (43 read, 11 write)

What you need

  • A Retently account you can log in to.
  • An AI client that supports remote MCP servers: Claude Code, Claude Desktop, or claude.ai on a Pro, Max, Team, or Enterprise plan.
  • Tools act on your account and respect your Retently role and permissions, so you only ever see and change what your account allows.

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 guide

OpenAI Codex

Add the Retently MCP server to OpenAI Codex and start working with your data.

Full step-by-step guide

Connect 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:

terminal
claude mcp add --transport http retently https://mcp.retently.com/mcp

In 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.

How long the session lasts. The client uses a short-lived access token and refreshes it silently in the background. You stay connected as long as you use the connection at least once every 30 days, up to a maximum of 90 days from when you first logged in. After that you log in again.

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:

terminal
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:

claude_desktop_config.json
{
  "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:readsurveys:sendsuppressions:readsuppressions:writetemplates:readoutbox:readoutbox:writeintegrations:readteam:readpii:readpii:write

Customer 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, read tools still work but return de-identified data. 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.

Tool catalog

55 tools grouped by area. Read tools never change anything. Write tools change data and follow the safety flow described below. Your AI client discovers each tool's arguments automatically once connected.

Feedback

list_feedbackreadList recent feedback, newest first, with score, comment, tags, topics, and historical customer tags. Each record also carries the campaign name, lifecycle status and rating category (positive, neutral, negative), and a privacy-safe verification summary (country, device, browser, OS) when available. The custom and Shopify properties snapshot, the send-time customer identity (email, name, job title, location), and the assignee name need pii:read. Ecommerce accounts also get structured Shopify order attributes (order number, total, items, products, coupons); the shipping address needs pii:read.
list_recent_feedbackreadList the most recent feedback, optionally within the last N days, with historical customer tags. This lean feed does not include customer custom properties.
get_feedbackreadGet one feedback record by id, with comment, follow-up question answers, the full ordered set of all survey answers, tags, topics (each with a sentiment label), and historical customer tags. Also carries the campaign name, lifecycle status and rating category (positive, neutral, negative), and a privacy-safe verification summary (country, device, browser, OS) when available. The custom and Shopify properties snapshot, the send-time customer identity (email, name, job title, location), the current customer identity, and the assignee name need pii:read. Ecommerce accounts also get structured Shopify order attributes (order number, total, items, products, coupons); the shipping address needs pii:read.
get_feedback_repliesreadGet the reply thread for a feedback record, oldest first, with a last-reply summary. Sender identity needs pii:read.
search_feedbackreadSearch feedback by comment text, campaign, metric, and score range. Returns scores, comments, tags, topics, and historical customer tags, plus the campaign name, lifecycle status and rating category (positive, neutral, negative), and a privacy-safe verification summary (country, device, browser, OS) when available. The custom and Shopify properties snapshot, the send-time customer identity (email, name, job title, location), and the assignee name need pii:read. Ecommerce accounts also get structured Shopify order attributes (order number, total, items, products, coupons); the shipping address needs pii:read.
aggregate_feedbackreadAggregate 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_statusesreadList the account's custom feedback workflow statuses.
tag_feedbackwriteAdd or remove tags on a feedback response.
set_feedback_topicswriteReplace the full set of topics on a feedback response.
star_feedbackwriteStar or unstar a feedback response for follow-up.
assign_feedback_userwriteAssign a feedback response to a team member, or unassign it.
resolve_feedbackwriteResolve or reopen a feedback response, or set its custom status.
add_feedback_notewriteAppend an internal note to a feedback response.
reply_feedbackwriteSend a reply email to the customer who left a feedback response.
import_feedbackwriteImport 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_filtersreadDescribe the account's feedback filter vocabulary, used to build a filter spec.
apply_feedback_filterreadApply 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_filtersreadList the account's named saved filters, each replayable with apply_feedback_filter.
list_recent_filtersreadList your recently applied feedback filters, each replayable with apply_feedback_filter.

Reports and scores

get_scorereadGet 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_statsreadGet a metric's monthly time series over the last 12 months.
get_topic_statsreadGet per-topic volume, sentiment split, and period-over-period change.
get_campaign_reportreadGet 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_trendsreadList the account's trend groups (name, metric, default flag, item count).
get_trend_itemsreadGet 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_customersreadList 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_customersreadSearch 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_customerreadGet 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_customerwriteCreate 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_customerwriteUpdate a contact's profile fields, tags, and custom properties. Partial update, so only the fields you pass change. Needs pii:write.
unsubscribe_customerwriteOpt 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_companiesreadList companies with firmographics, contact count, and per-metric CX scores (NPS, CSAT, XSAT, CES, Star), each null when there is no data.
get_companyreadGet 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_campaignsreadList the account's campaigns (name, metric, enabled and default state).
search_campaignsreadSearch campaigns by name, metric, and enabled state.
get_campaignreadGet one campaign by id, with its config and latest aggregate score.

Surveys

send_surveywriteQueue a transactional survey to a list of recipients through an active campaign. Sends live.

Templates

list_survey_templatesreadList survey templates (name, metric, channel, subject).
search_survey_templatesreadSearch survey templates by name, metric, and channel.

Digests

list_digestsreadList generated digest reports, newest first, with scores and report links.
get_digestreadGet 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_outboxreadList 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_statsreadGet delivery totals (sent, opened, responded, bounced, opted out).
get_queue_statusreadGet the transactional-survey queue depth.

Suppressions

list_suppressed_domainsreadList suppressed email domains and patterns.
list_suppressed_emailsreadList suppressed email addresses. Needs suppressions:read and pii:read.
get_suppressed_emailreadGet one suppressed email record. Needs suppressions:read and pii:read.

Integrations

list_integrationsreadList integrations with connection state and health. No credentials are returned.
get_integration_statusreadGet one integration's health and last-sync state. No credentials are returned.

Team

list_account_usersreadList team members with roles and status. Email and name need pii:read.
get_account_userreadGet one team member by id, with roles and status. Email and name need pii:read.

Account

get_account_plan_usagereadGet the account plan with usage versus limits per metered dimension.
list_account_attributesreadList the account's custom contact-attribute schema.
list_customer_tagsreadList the customer tags in use on the account.
list_feedback_topicsreadList the feedback topics defined for the account.

Server

pingmetaLiveness probe. Returns pong and a server timestamp. No auth required.

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_survey sends real surveys to real customers once confirmed. Use a test contact while you are trying it out. Suppressed addresses are dropped automatically.
  • reply_feedback sends a real email to the customer. Sending cannot be undone.

Verify it works

  • In Claude Code, /mcp should show retently connected 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. You should get rows scoped to your account.

The same check from the command line with a token:

terminal
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

SymptomWhat to do
The browser login never opensIn 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 authenticatedThe 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 notThe connection is fine and the problem is the credential. Re-authenticate with OAuth, or create a new token.
A tool returns a permission errorYour 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.
No tools appear after connectingRestart the client. Claude Desktop needs a full restart.

Looking for the REST API instead? See the Retently API reference.