MCP App Store
by KeenEthics
Productivity
TextExpander icon

TextExpander

by TextExpander, Inc.

Overview

Connect Claude to your TextExpander account to create, find, and manage your snippet library through natural conversation — no context switching. Ask Claude to draft a new snippet, reorganize a group, or track down that message template you wrote months ago, and it happens directly in your TextExpander account. Key features - Full snippet management — create, read, update, move, and delete snippets and snippet groups, with group settings like prefixes, notes, and expansion modes. - Smart search — find snippets by exact text, meaning (semantic), or a hybrid of both, across your personal and organization libraries, with pagination. - Rich macro support — Claude correctly builds fill-in fields, pop-up menus, date pickers, optional sections, clipboard/cursor/keystroke macros, and markdown formatting (bold, italic, links). - Duplicate detection — flags similar existing snippets before creating a new one, so your library stays clean. - Organization insights — pull usage statistics and team membership for admins (overview, per-snippet, per-user, and inactive-user reports). - Safety built in — destructive actions (deleting snippets or groups) require explicit confirmation, and all user-authored content is clearly marked so Claude treats it as data, never instructions. Works with your existing TextExpander account and permissions — Claude only ever acts on the snippets and organizations you already have access to.

Tools

add_snippet

ChatGPT
Add a NEW snippet to a snippet group. Only use this for creating brand new snippets. Before creating, this tool automatically checks for similar existing snippets. If highly similar snippets are found (similarity >= 0.7), it returns them as recommendations instead of creating a duplicate. To override this and force creation, set skipDuplicateCheck to true. IMPORTANT: Do NOT use this tool to edit or modify an existing snippet — it will create a duplicate. To modify an existing snippet, use update_snippet instead. First call search_snippets to find the snippet's _id, groupId, and dateUpdated, then call update_snippet with snippetId set to that _id. Use get_snippet if you need to read the full content first. IMPORTANT: When presenting results to the user, show only the abbreviation and content. Never display internal IDs (_id, groupId) in conversation — those are for internal tool use only. Content supports macros and markdown formatting. Macros: %fill:Label%, %fill:Label=Default%, %fill-area:Label%, %fill-date:Label%, %fill-date:Label:format%, %popup:Label:OptA,OptB,OptC%, %popup:Label:OptA,OptB:1% (1 = default index), %date:YYYY-MM-DD%, %embed:abbreviation%, %clipboard%, %cursor%, %key:tab%, %key:return%, %key:enter%, %key:esc%, %delay:N% (N = pause in milliseconds, 1–5000), %optional-begin:Label%, %optional-begin:Label:included%, %optional-end%, %conditional-begin:Label%, %conditional-begin:Label:N% (N = default branch index), %branch:BranchName%, %conditional-end% %delay:N% inserts an expansion pause of N milliseconds (clamped to 1–5000) between the surrounding content — useful before a %key% keystroke, e.g. type a value, %delay:500%, then %key:tab%. IMPORTANT: When a snippet needs a date, always use %fill-date:Label% (date picker) so the user can choose the date at expansion time. Use %date:format% only for auto-inserting today's date with no user interaction. Never hardcode a date value. Formatting: bold, italic, *bold italic, [link text](url). snippetType auto-detects to 7 (Formatted Text) when formatting is used. Plain text: set plainText to true to store the content exactly as written — markdown characters (, , *, [](), etc.) are kept literal instead of being converted to styling, and the snippet stays plain text (snippetType 6). Macros still expand normally. Use this when the expanded output feeds another system that needs literal markdown syntax (e.g. an LLM prompt), not visual formatting. Script snippets: to create an executable script snippet, pass snippetType 4 (JavaScript), 2 (AppleScript), or 3 (Shell Script), with content set to the raw script source. The source is stored verbatim: markdown is NOT parsed and TextExpander macros (%fill%, %date%, etc.) do NOT expand — every character, including %, , and [], is kept literal — and the snippet's content type is set so it runs on expansion. Use these types only when the user asks for a JavaScript/AppleScript/Shell script snippet; for ordinary text leave snippetType unset (defaults to plain/formatted text). Do not wrap script source in markdown code fences. Rich styling: content also accepts the snippet's node structure directly — pass the JSON object that get_snippet returns in its jsonContent field (shape {"nodes":[...]}) as the content string, and the server stores those nodes verbatim, skipping markdown parsing. This is the way to set styling markdown can't express (font, size, color, bulleted/numbered lists, tables); plain markdown content only produces bold/italic/link styling. IMPORTANT: Popup options are plain text only. They cannot contain %fill%, %date%, %embed%, or any other macro, and cannot contain commas. If you want a personalized greeting chosen from a menu, place the popup and any other macros side by side instead of nesting: %popup:Tone:Hi,Hello,Hey:0% %fill:CustomerName%, thanks for reaching out!. Do NOT write %popup:Tone:Hi %fill:Name%,Hello %fill:Name%:0% — the server will reject it. Conditional sections let the user pick ONE of several named branches at expansion time (shown as a dropdown), where each branch expands to i…

create_snippet_group

ChatGPT
Create a new snippet group. When organizationId is provided, the group is transferred to that organization by default (transferToOrg defaults to true); pass transferToOrg: false to keep it personal. IMPORTANT: When presenting results to the user, show only the group title and type. Never display internal IDs (groupId, organizationId) in conversation.

delete_snippet

ChatGPT
Delete a snippet from a snippet group. DESTRUCTIVE and irreversible. This action requires explicit authorization from the end user — never delete on your own initiative or in a bulk/automated sweep. Before deleting you MUST refer to the snippet by its abbreviation (never the internal ID) and get the user to clearly approve THIS specific deletion. Only then call this tool with confirm=true. If confirm is not true, the deletion is refused and you are reminded to obtain authorization first.

delete_snippet_group

ChatGPT
Delete a snippet group. DESTRUCTIVE and irreversible: this permanently deletes the group AND every snippet inside it. This action requires explicit authorization from the end user — never delete on your own initiative or in a bulk/automated sweep. Before deleting you MUST: (1) refer to the group by its title, never the internal ID; (2) tell the user how many snippets will be deleted along with it; and (3) get the user to clearly approve THIS specific deletion. Only then call this tool with confirm=true. If confirm is not true, the deletion is refused and you are reminded to obtain authorization first.

get_current_user

ChatGPT
Get the authenticated user's profile and settings

get_snippet

ChatGPT
Get the full content of a single snippet by ID. Use search_snippets first to find the snippet _id, then this tool to retrieve its complete content. IMPORTANT: When presenting results to the user, show only human-readable values (abbreviation, label, content). Never display internal IDs (_id, groupId, snippetId) in conversation — those are for internal tool use only.

get_snippet_group

ChatGPT
Get details of a specific snippet group. IMPORTANT: When presenting results to the user, show only human-readable values (title, description, member count). Never display internal IDs (_id, organizationId, groupId) in conversation.

get_snippet_statistics

ChatGPT
Get snippet usage statistics — expansion counts, characters saved, and activity. Two modes: - Personal (default): omit organizationId to get the authenticated user's own usage. Supports report types "overview" and "snippets". - Organization: pass organizationId to get organization-wide stats. Requires org admin access (use list_organizations to get the organizationId). Supports all four report types. If you are not an admin, the tool falls back to your personal statistics. Report types: - "snippets" (default): Which snippets are used most/least, with expansion counts and character savings. - "overview": Daily expansion totals and character counts. - "users": User activity breakdown (organization only — requires organizationId). - "inactive users": Users with no expansions in 30+ days (organization only — requires organizationId). Date range: Provide startDate and endDate as ISO 8601 strings (e.g., "2025-01-01"). Defaults to the last 30 days if omitted. IMPORTANT: When presenting results to the user, show only human-readable values (snippet abbreviations, user names, counts). Never display internal IDs in conversation.

get_snippets

ChatGPT
Get ALL snippets in a group. WARNING: For large groups this returns a lot of data. Prefer search_snippets to find a specific snippet, then get_snippet to fetch its full content. Delta sync: the response includes a group-level snippetsRevisionId; pass it back as previousRevisionId on a later call to receive only the snippets created or edited since. Deletions are NOT reflected in the delta, so an empty list means no creates or edits — not necessarily no changes; re-fetch periodically with previousRevisionId=0 to observe deletions. IMPORTANT: When presenting results to the user, show only human-readable values (abbreviation, label, content). Never display internal IDs (_id, groupId) in conversation — those are for internal tool use only.

list_organization_members

ChatGPT
List all members of a specific organization

list_snippet_groups

ChatGPT
List all snippet groups (folders) available to the authenticated user, including each group's groupPrefix. IMPORTANT: When presenting results to the user, show only human-readable values (title, description, snippetCount). Never display internal IDs (_id, organizationId) in conversation — those are for internal tool use only.

move_snippet

ChatGPT
Move a snippet from its current group into a different group. The snippet keeps its abbreviation, content, label, and type — only its group membership changes. Requires that the authenticated user owns both the source group (the snippet's current group) and the target group. NOTE: moving assigns the snippet a new internal ID; the new ID is returned as snippetId and the old one as previousSnippetId. IMPORTANT: When referring to the snippet or groups for the user, use the abbreviation and group titles, never the internal IDs.

search_snippets

ChatGPT
Search snippets by text or meaning. Supports three modes: "text" (keyword matching), "semantic" (meaning-based using embeddings — finds synonyms and related concepts), "hybrid" (default — combines both for best results). Returns lightweight results with content previews. Use get_snippet with the returned _id to fetch full content. Meaning-based matches ("semantic", and that half of "hybrid") can take a few minutes to include new or edited snippets; "text" mode sees them right away. SCOPE: Optional "scope" filters by group ownership — "my-snippets" returns only snippets in your personal groups (no organization), "org-groups" only snippets in organization-owned groups, "all" (default) both. PAGINATION: Pass an optional opaque "cursor" (from a prior response's "nextCursor") to fetch the next page; the cursor takes precedence over "page" and resolves to the same position. The legacy "page" + "limit" params remain fully supported (cursor preferred). Responses include "hasMore" plus, when there are more results, "nextCursor" encoding the next position. IMPORTANT: When presenting results to the user, show only human-readable values (abbreviation, label, contentPreview). Never display internal IDs in conversation.

update_snippet

ChatGPT
Update an existing snippet in-place. Use this tool (NOT add_snippet) whenever the user wants to edit, modify, or change an existing snippet. Workflow: First call search_snippets to find the snippet. From the results, note the _id, groupId, and dateUpdated fields. Use get_snippet if you need to read the full current content before editing. Use that snippet's _id as snippetId (NOT the groupId — they are different). Then call this tool with the changes. IMPORTANT: When presenting results to the user, show only the abbreviation and confirm what was changed. Never display internal IDs (_id, groupId, snippetId, dateUpdated) in conversation — those are for internal tool use only. Content supports macros and markdown formatting. Macros: %fill:Label%, %fill:Label=Default%, %fill-area:Label%, %fill-date:Label%, %fill-date:Label:format%, %popup:Label:OptA,OptB,OptC%, %popup:Label:OptA,OptB:1% (1 = default index), %date:YYYY-MM-DD%, %embed:abbreviation%, %clipboard%, %cursor%, %key:tab%, %key:return%, %key:enter%, %key:esc%, %delay:N% (N = pause in milliseconds, 1–5000), %optional-begin:Label%, %optional-begin:Label:included%, %optional-end%, %conditional-begin:Label%, %conditional-begin:Label:N% (N = default branch index), %branch:BranchName%, %conditional-end% %delay:N% inserts an expansion pause of N milliseconds (clamped to 1–5000) between the surrounding content — useful before a %key% keystroke, e.g. type a value, %delay:500%, then %key:tab%. IMPORTANT: When a snippet needs a date, always use %fill-date:Label% (date picker) so the user can choose the date at expansion time. Use %date:format% only for auto-inserting today's date with no user interaction. Never hardcode a date value. Formatting: bold, italic, *bold italic, [link text](url). snippetType auto-detects to 7 (Formatted Text) when formatting is used. Plain text: set plainText to true to store the content exactly as written — markdown characters (, , ***, [](), etc.) are kept literal instead of being converted to styling, and the snippet stays plain text (snippetType 6). Macros still expand normally. Use this when the expanded output feeds another system that needs literal markdown syntax (e.g. an LLM prompt), not visual formatting. Script snippets: to make a snippet an executable script, pass snippetType 4 (JavaScript), 2 (AppleScript), or 3 (Shell Script) together with content set to the raw script source. The source is stored verbatim — markdown is NOT parsed and macros do NOT expand — and the content type is switched so it runs on expansion. When converting an existing snippet to a script type, always include the new content in the same call; changing snippetType alone leaves the old stored content, which will not render correctly under a script type. Rich styling / lossless edits: content also accepts the snippet's node structure directly — pass the JSON object that get_snippet returns in its jsonContent field (shape {"nodes":[...]}) as the content string, and the server stores those nodes verbatim, skipping markdown parsing. This is the ONLY way to preserve or set styling that markdown can't express (font, size, color, bulleted/numbered lists, tables). Editing a formatted snippet with plain markdown content instead will DROP that styling (bold/italic/links survive; fonts/sizes/colors/lists do not). To edit losslessly: get_snippet, modify the jsonContent nodes, then send that JSON back as content. IMPORTANT: Popup options are plain text only. They cannot contain %fill%, %date%, %embed%, or any other macro, and cannot contain commas. If you want a personalized greeting chosen from a menu, place the popup and any other macros side by side instead of nesting: %popup:Tone:Hi,Hello,Hey:0% %fill:CustomerName%, thanks for reaching out!. Do NOT write %popup:Tone:Hi %fill:Name%,Hello %fill:Name%:0% — the server will reject it. Conditional sections let the user pick ONE of several named branches at expansion time (shown as a dropdown), where each branch expands to its own content. Structure: %conditional-begin:Label% then one %branch:BranchName% before eac…

update_snippet_group

ChatGPT
Update an existing snippet group. Supports changing the title, group prefix (a string prepended to all snippet abbreviations in the group), notes, expand-after mode (0=nothing, 1=delimiter, 2=any character), and whether snippet requests are enabled. IMPORTANT: When presenting results to the user, show only the group title. Never display internal IDs in conversation.

add_snippet

Claude

create_snippet_group

Claude

delete_snippet

Claude

delete_snippet_group

Claude

get_current_user

Claude

get_snippet

Claude

get_snippet_group

Claude

get_snippet_statistics

Claude

get_snippets

Claude

list_organization_members

Claude

list_snippet_groups

Claude

move_snippet

Claude

search_snippets

Claude

update_snippet

Claude

update_snippet_group

Claude

App Stats

30

Tools

ChatGPT, Claude

Platforms

Category

Memory Notes

Works with

ChatGPT
Claude

Data refreshed daily