add_snippet
ChatGPTAdd 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
ChatGPTCreate 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
ChatGPTDelete 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
ChatGPTDelete 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
ChatGPTGet the authenticated user's profile and settings
get_snippet
ChatGPTGet 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
ChatGPTGet 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
ChatGPTGet 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
ChatGPTGet 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
ChatGPTList all members of a specific organization
list_snippet_groups
ChatGPTList 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
ChatGPTMove 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
ChatGPTSearch 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
ChatGPTUpdate 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
ChatGPTUpdate 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
Claudecreate_snippet_group
Claudedelete_snippet
Claudedelete_snippet_group
Claudeget_current_user
Claudeget_snippet
Claudeget_snippet_group
Claudeget_snippet_statistics
Claudeget_snippets
Claudelist_organization_members
Claudelist_snippet_groups
Claudemove_snippet
Claudesearch_snippets
Claudeupdate_snippet
Claudeupdate_snippet_group
Claude