Design the theme taxonomy
Design a theme taxonomy from customer feedback and product context, get the user's approval, then apply it in Deck.
This page is an agent-readable workflow for Deck. Humans can follow along. Coding agents should treat the steps as the source of truth.
Design the theme taxonomy — agent workflow
- Use it when: the user asks "set up our themes", "make Deck's themes match our product areas", "our themes are a mess, start over" or "build a taxonomy from our feedback".
- Outcome: Deck's active themes match a taxonomy that the user approved. Each theme has a plain product-area name and a description that says what belongs in it. The insights sit in the right themes.
- Needs: Deck MCP, and customer feedback that is already in Deck. Every member with MCP access can use the theme write tools. They spend no credits. Subthemes need the Starter plan or higher.
1. Probe Deck MCP
Call get_user_context. This must be a real tool call.
- 401 Unauthorized: tell the user to connect Deck MCP in this client (Settings → Connections). Stop.
- No Deck tools: fetch and follow https://docs.getdeck.io/docs/agents/getting-started/prompts/ai-pm.md. Stop this workflow until the tools work.
2. Gather the product context
Make these calls at the same time:
get_overview: readorganization.product_information,company_information,target_audienceandkeywords, and the theme and feedback counts insummary.explore_workspacewithviewset tosettings: read your role and which features are on.
Then collect the product areas in the team's own words:
- If this session has the codebase, read the main routes, the navigation labels, the top-level modules and the product docs.
- If you have your own Linear or Jira tools, list the team, project and component names. Without them,
list_projectswithimportable_fromset tolinearorjiralists the Linear projects or Jira epics of a connected workspace. - Call
list_initiativesandlist_projectsto see the names the team already uses in Deck.
When summary shows no feedback, stop. No MCP tool imports customer feedback. Tell the user to upload files in the Deck web app (CSV import, user interviews) or to ask an organization admin to connect an integration in Settings → Integrations.
When product_information is empty, ask the user for the main product areas. An organization admin can add it in Settings → Context (Product context). Deck's agents use it to map new feedback.
3. Read the current themes
- Call
explore_themeswithlimitset to 100 andinclude_emptyset totrue. Page withoffsetuntil you have every theme. Keep the ID, name, description andinsight_countof each theme. - Call
explore_themeswithviewset tocategories. It shows which categories, such as bugs or feature requests, hold the most insights, and their top themes.
4. Sample the feedback
Read enough feedback to name each area with confidence. Do not read every insight.
- For the largest themes in Deck's order, call
explore_insightswiththeme_idandlimitset to 50. - Call
explore_subthemeswiththeme_idandsegment_scope: "all_customers"to see the finer topics in a theme. A subtheme that belongs to a different product area shows a theme to split. On the Free plan it returnsfeature_unavailable; useexplore_insightsinstead. - Call
explore_insightswithwindow_daysset to 30 andlimitset to 50 to read recent feedback that fits no theme well. Do not usesincehere: it returns every insight of the window and takes nolimit.
5. Propose the target taxonomy
Map every current theme to one action: keep, rename, merge, split, new or archive. Show the user one table:
| Target theme | Description | From current themes (Deck's insight count) | Action |
|---|---|---|---|
| Billing and invoices | Payments, invoices, refunds and plan changes. Not feedback about plan prices. | Billing (42), Payment errors (17) | merge |
| Search | Finding records with search and filters. Not saved views. | Search (88) | keep, new description |
Naming rules:
- A name has 1 to 120 characters after Deck trims it.
- A name must be unique in the organization, without case. Archived themes keep their names. A taken name returns
CONFLICT. When the conflict is an archived theme, the message gives its ID: callrestore_themeinstead ofcreate_theme. - Use plain product-area names that customers and the team use, for example "Search" or "Mobile app". Do not name a feeling ("Bad search") or a solution ("Add dark mode").
- Give each theme one product area. Prefer fewer, broader themes. Subthemes hold the detail inside a theme.
- Write a description of at most 1000 characters. Say what belongs and what does not. Deck's agents read the name and the description when they sort new feedback into themes.
- When PII redaction is on, Deck masks the emails and phone numbers in the theme descriptions that it returns, for example
j***@acme.com. Never send a masked description back: Deck refuses it withVALIDATION_ERROR. Write a new description without the masked text, or do not change the description.
Ask: "Apply this taxonomy?" Wait for a yes. Then list each merge and each archive, and get an explicit yes for each one.
6. Apply the taxonomy
Apply the rows in this order. Check each result before the next call.
- Rename or describe:
update_themewiththeme_idand one or more ofname,descriptionandcolor. An emptydescriptionclears it. - New:
create_themewithname,descriptionand, when you know them, up to 100insight_ids. - Merge:
merge_themeswithtarget_theme_idand 1 to 10source_theme_ids. It moves every insight link to the target and archives the sources. It cannot be fully undone:restore_themebrings back an empty source theme. To give the target the name of a source, first rename the source withupdate_theme, then merge, then rename the target. - Split:
create_themefor the new theme. Thenmove_theme_insightswithsource_theme_id,target_theme_idand up to 100insight_idsfor each call. Get the IDs fromexplore_insightswiththeme_id, or fromexplore_subthemeswith asubtheme_idandviewset toinsights. - Extra link:
add_theme_insightswhen an insight also belongs to a second theme. An insight has at most 5 themes. Deck skips the others asat_theme_limit. - Archive:
archive_themeonly for a theme with no insights and no place in the taxonomy.restore_themeundoes it.
Read the lists in each result, such as added, moved, already_linked, not_linked and at_theme_limit, and report the skipped insights. One unknown insight ID fails the whole call with NOT_FOUND. The missing IDs are in error.details.details.missing_insight_ids. Remove them and call again.
7. Check the result
- Call
explore_themeswith each changedtheme_id. Compare the name, description and insights with the approved table. - Call
explore_themesagain for the full list. Show the final themes with Deck's counts and thedeck_urlof each changed theme. - Tell the user that subthemes do not change now. Deck rebuilds them on the next synthesis run.
Deck still creates new themes when new feedback fits no theme. To keep the taxonomy clean, fetch and follow https://docs.getdeck.io/docs/agents/workflows/taxonomy-review.md from time to time.
Rules
- Build the taxonomy from this product and this feedback, not from a generic template.
- Quote Deck's numbers. Do not compute your own.
- Show the plan and get a yes before you call write tools.
merge_themesis a sensitive write: get an explicit yes for each merge, every time. Do the same for eacharchive_themecall. - MCP never deletes a theme or its insights. Theme tools act only on global themes. A survey theme returns
NOT_FOUND. - After each write, check for a top-level
errorkey. Whenidempotency.replayedistrue, Deck did not run the write again. See Write responses and retries. - If the user has more than one Deck organization, call
select_organizationfirst and passorg_idon every call.
Done when
- Each row of the approved table is applied, or the user knows why it is not.
explore_themesshows the approved names and descriptions, and no source theme of a merge is still active.- The user knows that subthemes refresh on the next synthesis run.