MCP App Store
by KeenEthics

Overview

Connect directly to your trumpet workspace and work with your deal rooms without leaving ChatGPT. Build new deal rooms, search your Template library, pull live engagement data, surface stakeholder activity and deal health insights. Perfect for prepping before a call, building a deal room mid-conversation, tracking deal momentum, and knowing exactly where to focus next.

Tools

add-canvas-widget

ChatGPT
Add a self-contained HTML/CSS/JS block (for example a Claude artifact) to a Pod as a canvas widget. Use this ONLY for custom HTML the user explicitly wants, such as an interactive calculator or bespoke chart. NOT for Content Library files, documents, PDFs, images or videos: those go in a standard widget via add-widget (pdfviewerv3, attachment, carousel, video), and plain text goes in a plaintext widget. Requires podId (from search or create-pod) and code. Omit pageId to append to the first page. The code renders in a sandboxed iframe with a strict CSP: one root element with an inline <style> block, inline vanilla <script> only, no external scripts, stylesheets, fonts, network or storage. The root element must set background: var(--color-background, #ffffff) and no outer border. Style text with the per-stem variables from get-pod-styles (e.g. var(--font-family-h1, system-ui, sans-serif), var(--color-body, #1a1a1a), var(--radius, 8px)). Reference Content Library files as {{MEDIA:id}} and list those ids in mediaIds. On success, structuredContent includes widgetId, pageId, podId and primaryUrl. On failure: isError: true, error in text only.

add-group-to-mutual-action-plan

ChatGPT
Add a group (phase) to the end of a Mutual Action Plan. Pass mapId and a title. Only create a group that will hold steps; a flat plan needs a single group. Returns groupId for add-step-to-mutual-action-plan. Response shape is defined by outputSchema.

add-mutual-action-plan

ChatGPT
Create an empty Mutual Action Plan (MAP) widget in a Pod. Pass podId from search or create-pod; pass pageId to place it on a page (get-pod-widgets lists the pages with their titles and ids), otherwise the first page is used. A page can hold one MAP: when it already has one the call fails, so use get-mutual-action-plan-from-pod to edit the existing plan instead. Returns mapId, which every other MAP tool needs, plus widgetId and pageId. Follow with update-mutual-action-plan-settings for the title, then add-group-to-mutual-action-plan and add-step-to-mutual-action-plan. Response shape is defined by outputSchema.

add-step-to-mutual-action-plan

ChatGPT
Add one step (task, meeting or milestone) to a group in a Mutual Action Plan. Pass mapId, groupId and title; optionally description, assignees (each needs an email), color, and startDate, endDate, completedAt as ISO strings. Returns stepId. Use update-mutual-action-plan-steps to change a step afterwards. Response shape is defined by outputSchema.

add-widget

ChatGPT
Add a standard widget to a sales room (Pod). This is the tool for hosting Content Library files and normal content: pdfviewerv3 for a PDF, attachment for any other document or download (deck, spreadsheet, doc, zip), carousel for one or more images, video for a video, plaintext or an rte preset for text, plus about, faq, features, logos, embedwebsite, linkpreview and the rest. For a Content Library file pass `file` as `{ id }` with the `id` from the search-media result (`url` and `name` are optional and ignored in favour of the stored file); the server checks you can read that file and places its URL and name in the right fields for the widget type, so the file is attached in the same call. A file id you cannot read is rejected. For other fields (a title, settings) call get-widget-guide with the `widgetType` and pass `content`; fields you omit keep their defaults, including inside nested objects such as `settings`, while arrays you pass replace the default array. RTE widgets (plaintext, rte) take no content here: add them empty, then write blocks with update-widget. Requires podId; omit pageId to use the first page and position to append. Never use add-canvas-widget for a file. On success, structuredContent includes widgetId, widgetEntityId, pageId, position, widgetType and primaryUrl. On failure: isError: true, error in text only.

create-pod

ChatGPT
Create a new sales room (Pod). Requires title. For a template-based Pod, call search-templates first and pass the chosen template id as templateId. Set input variables as a key-value map using exact keys from that row's variableNames (values are shown in the live pod placeholders). recipientCompany and value set pod prospect/deal fields only—they do not auto-fill placeholder keys. Omit templateId for a blank Pod. On success, structuredContent includes `variables`: an array of { variableName, value, isMissing } for each template placeholder. If any isMissing is true, call `update-pod-variables` or ask the user. Also returns `id`, `title`, `primaryUrl`, `shareUrl`, `recipientCompany`, `status`. Use `primaryUrl` as the default next step. On failure: isError: true, error in text only (no structuredContent).

delete-mutual-action-plan-groups

ChatGPT
Delete one or more groups (phases) and the steps inside them from a Mutual Action Plan. Pass mapId and groupIds from get-mutual-action-plan; every group must belong to the MAP. Groups are deleted one by one, so an error reports which groups were already removed. Deletion is immediate, so confirm intent with the user first. Response shape is defined by outputSchema.

delete-mutual-action-plan-steps

ChatGPT
Delete one or more steps from a Mutual Action Plan. Pass mapId and stepIds from get-mutual-action-plan; every step must belong to the MAP. Deletion is immediate, so confirm intent with the user first. Response shape is defined by outputSchema.

fetch

ChatGPT
Load engagement metrics and Pod details for a single sales room. Pass the Trumpet Pod ID from search results—not a CRM or external ID.

get-cms-analytics

ChatGPT
Get engagement analytics for Content Library (CMS) files by media ID, the same numbers shown on the Library analytics page in Trumpet. Pass mediaIds from search-media results (1-10 per call). Response shape is defined by outputSchema: each result has allTime usage (pods, users, downloads, link clicks), last30Days metrics with current and previous period values (views, downloads, per-viewer averages, per-document-page views and time in seconds, win rate across deals that used the file in the last 60 days), and video watch stats for video files. IDs that were invalid, not found, or not readable are listed in errors rather than failing the call. Returns an error when the workspace has content analytics disabled.

get-cms-content

ChatGPT
Load full Content Library (CMS) documents by media ID. Pass mediaIds from search-media results (1-10 per call). Response shape is defined by outputSchema: each result has title, type, size, description, aiSummary, tags, folder, createdBy, urls (use urls.url to share or embed), permissions, isApproved, isArchived, isInternal, timestamps, and the extracted markdown body with bodyStatus (ready, truncated, skipped, unavailable). Video and audio files include transcript when available. Set includeBody false for a fast metadata-only lookup; when a body has never been extracted the first call can take up to a few minutes while extraction runs. Use maxBodyChars to bound the payload. IDs that were invalid, not found, or not readable are listed in errors rather than failing the call.

get-mdx-guide

ChatGPT
Return the MDX markup reference for Trumpet text (RTE) widgets: the Markdown and JSX-style tags read-widget-mdx returns and update-widget-mdx accepts, with composition and layout guidance. This is the same reference Trumpet's Copilot authors widgets from, so call it once before composing or changing RTE content. Takes no parameters.

get-mutual-action-plan

ChatGPT
Return the full state of one Mutual Action Plan by mapId: settings, groups in display order and steps with their ids, group, assignees, dates, completion and buttons (each with a 0-based index). Read this before editing so step and group ids are current. Response shape is defined by outputSchema.

get-mutual-action-plan-from-pod

ChatGPT
Find the Mutual Action Plan in a Pod and return its full state: settings, groups in display order and steps with ids, assignees, dates, completion and buttons. Call this first when you only know the podId; pass pageId to prefer the MAP on that page. When the Pod holds several MAPs the call returns isError listing each mapId so you can call get-mutual-action-plan directly. Response shape is defined by outputSchema.

get-pod-styles

ChatGPT
Get the resolved CSS theme for a Pod: font families, sizes, weights, colors, border radius, page background and named brand color palettes. Call this before add-canvas-widget so the HTML matches the brand and Pod style. Reference every theme entry as var(--name, <value>) in the widget CSS; apply colorPalettes hex values directly.

get-pod-widgets

ChatGPT
List the widgets in a sales room (Pod) across all of its pages: each widget's id, type, position, pageId, pageTitle and any linkedLeft / linkedRight pairing, plus the ordered pages list. Results are paginated: offset and limit (default 20, maximum 100) apply to widget rows, so follow nextOffset while hasMore is true to read them all. Does NOT return widget content; call get-widget-content for one widget. Pass the Trumpet Pod ID from search results. A widget id is the page shell id (e.g. "plaintext-abc123"), not a database id — pass it unchanged to get-widget-content. Response shape is defined by outputSchema.

get-widget-content

ChatGPT
Read one widget's editable content. Pass widgetId (the shell id from get-pod-widgets) and podId; pass pageId too when the same widget id appears on several pages. Response shape is defined by outputSchema: widget.isRteWidget decides the editing path. When true, widget.jsonBlocks is an array of items, each with itemIndex and a blocks array whose entries carry their own 0-based index — most widgets have a single item at itemIndex 0. When false, widget.rawContent is the widget's raw JSON object. Call get-widget-guide with widget.type to learn the structure and rules before composing content for it. Returns isError when the widget cannot be found or the user cannot read the Pod.

get-widget-guide

ChatGPT
Return the editing guide for one widget type: its purpose, create and update rules, quality checks, field slots, worked examples, and for RTE widgets the reference for every supported block type. This is the same guidance Trumpet's Copilot receives before it writes a widget, so call it before composing or changing widget content. Pass widgetType exactly as returned in the type field of get-pod-widgets or get-widget-content (e.g. "plaintext", "whatweknowrte", "about"). Response shape is defined by outputSchema; text holds the same guide rendered as markdown. Returns isError with the list of guided types when the widget type is unknown.

read-widget-mdx

ChatGPT
Read one widget for editing. Pass widgetId (the shell id from get-pod-widgets) and podId; pass pageId too when the same widget id appears on several pages, and itemIndex for multi-item widgets (default 0). Response shape is defined by outputSchema: for a text (RTE) widget isRteWidget is true and markup holds the item as MDX markup (Markdown plus JSX-style tags) — edit it and pass the whole markup to update-widget-mdx. For any other widget isRteWidget is false and rawContent holds its raw JSON object — edit and save it with update-non-rte-widget. Call get-mdx-guide for the markup reference. Returns isError when the widget cannot be found or the user cannot read the Pod.

search-media

ChatGPT
Search the Content Library (CMS) for media files (PDFs, decks, images, videos, documents) you can access in Trumpet. Combines AI semantic search over file contents, filename/title matching, and exact tag matching via labels. query should be descriptive (e.g. "healthcare case studies", "pricing proposal for Acme"); include an exact file name at the end of the query when the user names a specific file. Response shape is defined by outputSchema: results (each with id, originalName, type, url, optional description, contentSnippet, tags) plus meta. Use url to share or embed a file and keep id for follow-up tool calls. Returns an error when the workspace has AI content search disabled.

search-templates

ChatGPT
Find Pod templates you can use with create-pod. Omit query or use empty string to browse. Response shape is defined by outputSchema (results + meta with pagination). Each result includes variableNames (placeholder keys for that template—use as keys in create-pod variables). Use templateId from a result row when calling create-pod. If meta.hasMore is true, call again with offset increased by meta.limit.

set-mutual-action-plan-step-button

ChatGPT
Add a link button to one or more steps in a Mutual Action Plan, or update an existing button. Pass mapId and stepIds. Omit buttonIndex to add a button (label and url are then required); pass a button's index from get-mutual-action-plan to update only the fields given. Only http(s) URLs are accepted and existing buttons are never removed. Steps are written one by one, so an error after a partial write lists the updatedStepIds already changed. Response shape is defined by outputSchema.

update-mutual-action-plan-groups

ChatGPT
Rename or hide one or more groups in a Mutual Action Plan. Pass mapId and groups, each with a groupId from get-mutual-action-plan plus title and/or isHidden. Every group must belong to the MAP; empty titles are rejected. Response shape is defined by outputSchema.

update-mutual-action-plan-settings

ChatGPT
Update a Mutual Action Plan's title, default view (list, board or calendar), viewer permissions, file-upload policy or progress bar. Pass mapId and at least one setting; omitted settings are unchanged. Response shape is defined by outputSchema.

update-mutual-action-plan-steps

ChatGPT
Apply one change to one or more steps in a Mutual Action Plan: title, type, description, assignees (each needs an email), color, start and end dates, completion (isComplete, completedAt), visibility to pod viewers (isHidden) or postponeDays. Pass mapId, stepIds from get-mutual-action-plan and at least one field. postponeDays cannot be combined with dates, and every step must belong to the MAP. Response shape is defined by outputSchema.

update-non-rte-widget

ChatGPT
Replace the raw content object of a non-RTE widget (isRteWidget false in get-widget-content), such as about, carousel, video, attachment, pdfviewerv3, faq or logos. Always call get-widget-content first and get-widget-guide for the widget's type to learn the field shapes. Pass widgetId and podId (and pageId when get-widget-content returned one) plus content as the complete modified rawContent object, not a partial patch and not a JSON string. Fields you omit are removed, so copy everything you are not changing from rawContent unchanged. Response shape is defined by outputSchema. Returns isError when the widget is an RTE widget, the type is unsupported or managed by a dedicated tool (Mutual Action Plan, forms, questions, e-signature, pricing, timeline), or the user cannot edit the Pod.

update-pod-variables

ChatGPT
Set or update template placeholder variable values on an existing pod. Requires podId (from create-pod) and variables as a key-value map—keys must match variableName values from create-pod variables or variableNames from search-templates. Merges into existing values. Returns the full variables snapshot after update; use when create-pod items have isMissing: true or the user provides more placeholder values. On failure: isError: true, error in text only.

update-widget

ChatGPT
Replace the whole block array of one item in an RTE widget. Prefer update-widget-mdx instead; use this only when a widget guide requires a block write. The block format cannot represent every kind of content (videos, audio, files, embeds), so a write from blocks loses anything the blocks do not show. Always call get-widget-content first and get-widget-guide for the widget's type, and validate the array with validate-blocks before writing. Pass widgetId and podId from get-widget-content, itemIndex (0 for a single-item widget) and the complete blocks array. Invalid blocks are skipped and reported in skippedBlocks; a write that drops more than half of the existing blocks is refused as an accidental overwrite. Response shape is defined by outputSchema. Returns isError when the widget is not an RTE widget, the type is unsupported, or the user cannot edit the Pod.

update-widget-blocks

ChatGPT
Edit an RTE widget with targeted block operations: replace, insert, delete or append blocks in one item. Prefer read-widget-mdx and update-widget-mdx instead: the block format cannot represent every kind of content (videos, audio, files, embeds), and a write rebuilds the item from the blocks, so content the blocks do not show is lost. Every block is validated and the whole batch is rejected on error. Always call get-widget-content first and get-widget-guide for the widget's type. Pass widgetId and podId from get-widget-content, itemIndex (0 for a single-item widget, otherwise the item's itemIndex), and operations in the order to apply them. Each blockIndex is read from the block's own index field in get-widget-content, adjusted for earlier operations in the same batch that inserted or deleted blocks above it. Response shape is defined by outputSchema and lists the resulting block order. Returns isError when the widget is not an RTE widget, the type is unsupported, an index is out of range, or the user cannot edit the Pod.

update-widget-mdx

ChatGPT
Write one item of a text (RTE) widget from MDX markup. This is the preferred way to change an existing RTE widget: always call read-widget-mdx first, change only what the user asked for, keep every other line exactly as returned (including tags you do not recognise, which stand for videos, audio, files and embeds, and {{variable}} tokens), and pass the WHOLE markup — it replaces the item, it is not a patch. Blocks you return unchanged keep their editor ids and formatting. Pass widgetId and podId from read-widget-mdx and itemIndex (0 for a single-item widget). Markup that does not convert is rejected with the problems listed and nothing is written; non-blocking warnings are returned in issues. Call get-mdx-guide for the markup reference. Returns isError when the widget is not an RTE widget, the type is unsupported, or the user cannot edit the Pod.

validate-blocks

ChatGPT
Validate an RTE block array against Trumpet's block schema without writing anything. Use it after planning content for an RTE widget and before any widget write; if valid is false, repair the blocks using preflightErrors, invalidBlocks (per-block path and message) and conversionErrors, then validate again. Call get-widget-guide for the block type reference. Response shape is defined by outputSchema.

Capabilities

Writes

Similar Apps