Move from Plain to Rinhelp
By Wilbert Liu, founder of Rinhelp · Facts checked · Markdown for AI agents
Plain threads, customers and help center articles can be read through Plain’s official MCP server or its GraphQL API. Messages live in each customer’s timeline rather than in the thread, so the full history is read customer by customer.
| Conversations | Time to read them from Plain |
|---|---|
| 1,000 | no per-minute limit to time it by |
| 10,000 | no per-minute limit to time it by |
Limit used: no per-minute number (no number in Plain’s developer docs), about 2 per conversation. Rinhelp takes up to 3,000 conversations a minute.
Free. Importing never emails your customers, never runs Rin and never counts toward a plan.
Needs a person. Make a Plain API key with thread read permission for a coding agent, or sign in to Plain’s MCP server with your own account for a chat app. Snippets have no documented API, so you paste the ones you use.
Paste one prompt
Connect your AI agent to Rinhelp first, then paste the prompt for the app you use. It reads this page’s Markdown and follows Rinhelp’s steps.
Connect Plain’s MCP server at https://mcp.plain.com/mcp next to Rinhelp, then follow https://rinhelp.com/migrate/plain.md to copy my Plain help center articles into Rinhelp. I’ll paste my snippets for you to save as saved replies, since Plain’s MCP has no snippet tools.
Follow https://rinhelp.com/migrate/plain.md to move every Plain thread into Rinhelp. Call Plain’s GraphQL API with the API key I give you as a bearer token, list the threads, then read each customer’s timeline entries oldest first and match them back to their threads.
Their words and ours
| In Plain | In Rinhelp |
|---|---|
| Thread | Conversation |
| Timeline entry | Message |
| Customer | Customer |
| Snippet | Saved reply |
| Help center article | Article |
| Label | Tag |
What stays behind
- Workflows and automations
- Slack and channel connections
- Reports
- Customer cards
Plain facts that shape the move
Plain’s API is GraphQL at one address, and an API key goes in the Authorization header as a bearer token. Source, checked .
Each Plain API key has only the permissions you give it, and listing threads needs thread read permission. Source, checked .
Plain lists threads page by page, with filters on status, assignee, customer, labels and priority. Source, checked .
Plain keeps messages in a timeline read per customer, oldest first, in cursor pages, so entries have to be matched back to their threads. Source, checked .
Plain’s official MCP server signs in with your own Plain account, needs no API key, and can do only what your role allows. Source, checked .
Plain’s MCP server lists threads with filters, customers, and help centers with their articles, but documents no snippet tools. Source, checked .
Plain’s API lists help centers and fetches an article by its ID or slug. Source, checked .
Plain’s snippets pages describe them only inside the app, with no query for listing them. Source, checked .
Plain’s attachments page covers only uploading, with upload links that last 2 hours, and doesn’t say how to download an existing file. Source, checked .
Plain’s blog says its API has no rate limits; its developer docs give no number either way. Source, checked .
Questions
Can I do the whole Plain move from a chat app?
Help center articles, yes, through Plain’s MCP server. Full thread history comes from each customer’s timeline in the GraphQL API, which is a job for a coding agent.
What permissions does my Plain API key need?
Thread read permission at least, because a Plain key can only do what you grant it and listing threads needs that one. You choose the permissions when you make the key.
Does Plain have a rate limit?
Plain’s blog says it has none, and its developer docs give no number. On Rinhelp’s side, imports take 50 conversations per call and 60 calls a minute.