dealdesk-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| AGENTHOUSE_API_KEY | Yes | Your AgentHouse API key (project key). Development keys use the local_ prefix. | |
| AGENTHOUSE_API_URL | No | The base URL of the AgentHouse API. Defaults to https://api.agenthouse.org. | https://api.agenthouse.org |
| AGENTHOUSE_PROJECT_ID | Yes | The ID of the AgentHouse project to use with DealDesk. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| dealdesk.discoverA | List additional DealDesk tool domains (desk, quotes, portfolio, directory, orders, admin) and unlock skill-gated tools for one domain. Also returns authorizedProjectIds. Prefer dealdesk.list_projects to list Connect projects. |
| dealdesk.list_skillsB | List shipped DealDesk sales skills packaged with dealdesk-plugin. Returns authorizedProjectIds. |
| dealdesk.list_projectsA | List DealDesk project ids authorized by the current Connect token or API key. Call this before project-scoped tools when more than one project may be authorized. Does not require projectId. |
| dealdesk.list_cardsA | List DealDesk desk cards for one project. Default rows are summaries (cardId, title, stage, quoteId). Filter with q, stage, and/or ownerUserId. Pass fields=full for the complete card. Returns total, hasMore, nextCursor, projectId, and authorizedProjectIds. |
| dealdesk.list_desk_usersA | List DealDesk users eligible as card/case owners (userId, email, displayName). Use before setting ownerUserId on create_card / patch_card / create_case / patch_case. |
| dealdesk.list_desk_stagesA | List the project’s discrete desk board stages/columns (columnId, label, labelDe, order). Use before setting stage on create_card / patch_card / create_case / patch_case. Never invent stage ids by slugifying UI labels. |
| dealdesk.get_cardC | Get one desk card by id. |
| dealdesk.list_card_activityA | Read persisted desk-card change history (stage/owner/account/contact changes, notes, quote/order/share milestones). Newest first. Empty history is valid. Distinct from status-update timeline (comments/tasks/emails). |
| dealdesk.create_cardA | Create a desk card (title, stage, optional description, ownerUserId, priority, Customer Directory company/contact, and optional deal estimates: estimatedValue, estimatedValueCurrency, estimatedValuePeriod, probabilityPercent). Resolve owners with dealdesk.list_desk_users. Prefer estimate fields over create_case when the opportunity already lives on the desk. |
| dealdesk.patch_cardA | Update a desk card (title, stage, description, ownerUserId, priority, company/contact, deal estimates, quote dealValueOverride). Pass companyId/contactId to link Customer Directory records (same as HTTP accountRef/contactRef). Pass null to clear company/contact/owner. When company/contact or owner changes, also updates a linked local case and quote customer/owner link where applicable (same as the DealDesk UI). estimatedValue / estimatedValueCurrency / estimatedValuePeriod / probabilityPercent update the card (or its linked local case when present). dealValueOverride / dealValueOverrideNet apply only to unaccepted quote cards. Do not call create_case to set estimates on an existing card. Soft close uses stage closed — no DELETE. |
| dealdesk.add_card_noteA | Add a structured note to a desk card (title + body). For the main card description field, use dealdesk.patch_card with description. Do not use notes to log emails — use dealdesk.log_email (or create_status_update with touchpoint email_incoming/email_outgoing). |
| dealdesk.patch_card_noteA | Update an existing structured desk-card note. Prefer get_card first for noteId and updatedAt. Delete is not available through MCP. |
| dealdesk.add_company_noteC | Add a structured note to a customer-directory company (title + body). |
| dealdesk.patch_company_noteA | Update an existing company note. Prefer get_company first for noteId and updatedAt. Delete is not available through MCP. |
| dealdesk.add_contact_noteC | Add a structured note to a customer-directory contact (title + body). |
| dealdesk.patch_contact_noteA | Update an existing contact note. Prefer get_contact first for noteId and updatedAt. Delete is not available through MCP. |
| dealdesk.get_company_commercial_summaryC | Open/won/lost pipeline value and linked deals, quotes, and orders for a company. |
| dealdesk.get_contact_commercial_summaryC | Open/won/lost pipeline value and linked deals, quotes, and orders for a contact. |
| dealdesk.list_status_updatesB | List status updates (comments, tasks, touchpoints including email) for a desk card, company, or contact. |
| dealdesk.create_status_updateA | Create a status update: comment, task, or touchpoint (phone_call, meeting, email_incoming, email_outgoing, misc). Prefer dealdesk.log_email for inbound/outbound email logs. |
| dealdesk.patch_status_updateA | Update an existing status update (comment body, task fields/status, or touchpoint fields). Authors may edit their own comments/touchpoints; tasks are editable by staff. Prefer list_status_updates first for statusUpdateId and updatedAt. |
| dealdesk.log_emailA | Log an inbound or outbound email on a desk card as a status-update touchpoint (email_incoming / email_outgoing). Persists structured from/to (plus subject/text). Do not use add_card_note for email logs. |
| dealdesk.list_quotesB | List quotes for a project, optionally filtered by status or search text. |
| dealdesk.get_quoteC | Get quote status, totals, acceptance summary, analytics, and customer share links (classic + rich/experience paths). |
| dealdesk.get_quote_summaryB | Read persisted quote line items/options/groups and status without enrichment or repricing. |
| dealdesk.list_quote_sharesB | List customer share links for a quote. classicPath is the standard share; experiencePath is the rich experience Desk. |
| dealdesk.create_quote_shareA | Create a customer share link for a quote. Returns classicPath (standard share) and experiencePath (rich experience). Soft-close later with patch_quote_share isOpen=false; delete is not available through MCP. |
| dealdesk.patch_quote_shareA | Update a quote share link (label, password, quickchat, or isOpen). Set isOpen=false to close the link without deleting. |
| dealdesk.create_quoteA | Create a classic draft quote with optional lineItems, options, and groups. Prefer companyId/contactId (Customer Directory) so snapshots are resolved server-side. Use this path for free-form / open positions; use create_quote_from_configuration for CPQ. |
| dealdesk.clone_quoteA | Clone an existing quote into a new draft. Optionally retarget title, opportunity, and Customer Directory company/contact. Prefer clone when the user likes a past quote. |
| dealdesk.replace_quote_itemsA | Replace draft quote lineItems, options, and groups in one write (classic authoring). Draft-only; refused for accepted/declined quotes. Send the full arrays you want persisted. |
| dealdesk.create_quote_from_configurationB | Create a quote from a published Portfolio configuration (CPQ). Optional quoteLayout shapes groups/optional/editable presentation; commercial amounts stay server-evaluated. |
| dealdesk.update_quote_from_configurationA | Re-apply a published Portfolio configuration onto an existing draft quote (full commercial replace). Does not change title/customer/ownership. Optional quoteLayout reshapes presentation. |
| dealdesk.portfolio_summaryC | Get Portfolio draft/published summary for a project. |
| dealdesk.portfolio_evaluateC | Evaluate a CPQ configuration against the Portfolio (side-effect free). |
| dealdesk.list_companiesC | Search or list customer-directory companies. |
| dealdesk.get_companyC | Get a company by id. |
| dealdesk.create_companyB | Create a company in the customer directory. Send legalName or name at the top level (name maps to legalName). externalId is optional and auto-generated as local-company- when omitted — do not require fields.externalId. |
| dealdesk.list_contactsC | Search or list customer-directory contacts. |
| dealdesk.create_contactB | Create a contact in the customer directory. Requires displayName or name (or firstName/lastName). externalId is optional and auto-generated when omitted. |
| dealdesk.export_intelligenceC | Export Deal Intelligence workbook (Excel) for analysis. Bounded export path. |
| dealdesk.render_card_summaryA | Show the DealDesk card-summary widget in MCP Apps hosts (ChatGPT). Call this when the user should see the card UI. Data tools like get_card return JSON only. |
| dealdesk.render_quote_totalsA | Show the DealDesk quote-totals widget in MCP Apps hosts (ChatGPT). Call this when the user should see quote totals UI. get_quote returns JSON only. |
| dealdesk.patch_quoteA | Update draft quote metadata (title, language, currency, customer snapshots, experience template). Does not accept/decline and does not replace pricing lines. |
| dealdesk.render_quote_pdfA | Generate a quote PDF into the project DealDesk exports folder and return the file path. Does not persist the PDF on the quote. |
| dealdesk.get_contactC | Get one customer-directory contact by id. |
| dealdesk.patch_companyB | Update a company. Requires expectedRevision from get_company for optimistic concurrency. |
| dealdesk.patch_contactB | Update a contact. Requires expectedRevision from get_contact for optimistic concurrency. |
| dealdesk.list_casesC | List DealDesk cases with optional filters. |
| dealdesk.get_caseC | Get one DealDesk case by id. |
| dealdesk.create_caseA | Create a DealDesk case (sales/request case, not a Salesforce Opportunity search). Creating a case also adds a desk card. To set value/chance/period on an existing desk card, use dealdesk.patch_card instead — do not create_case as a substitute. |
| dealdesk.patch_caseA | Update a DealDesk case (title, stage, description, links, estimates including estimatedValuePeriod). For an existing desk card, prefer dealdesk.patch_card with the same estimate fields (it updates the linked case when one exists). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| DealDesk card summary | |
| DealDesk quote totals | |
| DealDesk portfolio publish preview |
TDQS
Scored across 52 tools
The tool set contains many closely related operations—create_card vs create_case, patch_card vs patch_case, and multiple quote authoring variants—that require careful reading to distinguish. Descriptions provide explicit guidance (e.g., 'prefer X', 'do not use Y'), which mitigates but does not eliminate the overlap.
Names predominantly follow a snake_case verb_noun pattern (list_*, get_*, create_*, patch_*, add_*), with minor exceptions like portfolio_summary, portfolio_evaluate, and discover. The convention is largely predictable and readable.
52 tools far exceed the typical 3-15 range and cross into extreme mismatch territory for an MCP server, even for a broad sales platform. The surface is bloated with many fine-grained variants that could be consolidated.
The surface covers CRUD for companies, contacts, cards, cases, quotes, and shares, plus notes, status updates, and exports. Gaps are minor—no hard deletes (intentional soft close), no dedicated get for notes/status updates, and order/admin domains are referenced but not included.