Sales Prep MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LINEAR_API_KEY | No | Linear: Personal API key | |
| NOTION_API_KEY | No | Notion: Integration secret (ntn_…) | |
| STRIPE_API_KEY | No | Stripe: Secret or restricted key | |
| TAVILY_API_KEY | No | Tavily: API key | |
| GRANOLA_API_KEY | No | Granola: API key | |
| SLACK_BOT_TOKEN | No | Slack: Bot token (xoxb-…) | |
| GOOGLE_CLIENT_ID | No | Google: OAuth client ID | |
| FIRECRAWL_API_KEY | No | Firecrawl: API key | |
| GOOGLE_CLIENT_SECRET | No | Google: OAuth client secret |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gcalendar_events_listC | List events matching a given search filter. |
| tavily_searchA | Execute a real-time web search optimized for AI agents. Use when sources are unknown or current web context is needed. Prefer search_depth advanced with chunks_per_source 3 for stronger evidence per source. |
| firecrawl_scrapeB | Scrape a single URL and optionally extract information. Use when the user wants to read or summarize a specific webpage. Supports markdown, HTML, screenshots, and structured JSON extraction. |
| gmail_threads_listC | List Gmail threads. |
| slack_chat_post_messageA | Send a message to a Slack channel, private group, or DM. Provide |
| granola_notes_getA | Read one meeting note: its AI summary, the people who attended, the calendar event it was taken against, and the folders it belongs to. Pass include='transcript' to get the transcript inline as well. A transcript too large to inline answers 413 TRANSCRIPT_TOO_LARGE. Read it with notes_transcript_get instead. |
| gmail_drafts_createC | Save an email draft to Gmail. |
| gcalendar_events_insertC | Create a calendar event; returns details of the event. |
| notion_pages_updateA | Update a page's property values, icon, cover, or trash state. Properties not named are left alone, and a value set to null is cleared. This cannot move a page — use |
| gsheets_spreadsheets_values_getC | Returns a range of values from a spreadsheet. |
| firecrawl_extractA | Extract structured data from one or more URLs using an LLM. Poll results with extract_status. |
| gsheets_spreadsheets_values_updateC | Sets values in a range of a spreadsheet. |
| gforms_forms_responses_listA | List a form's submitted responses, newest page first, up to 5000 per page. The only supported filter is on submission time: pass filter='timestamp >= 2026-01-01T00:00:00Z' to read what has arrived since a point in time. Answers come back keyed by questionId. |
| gmail_messages_sendC | Send an email via the Gmail API. |
| stripe_prices_listA | List prices. Filter by product to find what a product costs. |
| stripe_checkout_sessions_createA | Create a Checkout Session and get a hosted payment URL. Pass |
| gdocs_documents_getA | Read a document's full structural content. The document ID is the long string in its URL, between '/d/' and '/edit'. Pass include_tabs_content=true for a document with several tabs, since the default response covers only the first. |
| stripe_customers_createC | Create a customer. |
| stripe_invoice_items_createA | Add a line to an invoice. Name an existing price as |
| stripe_invoices_createA | Create a draft invoice for a customer. It bills nothing until finalised, so this is the safe half of invoicing. |
| stripe_invoices_finalizeA | Finalise a draft invoice, making it open and payable. The amounts stop being editable at this point. |
| stripe_subscriptions_listB | List subscriptions. Filter by customer or status. |
| notion_pages_createA | Create a page — as a subpage of another page, or as a row of a database by giving its |
| linear_customer_createB | Create a customer. Only |
| slack_conversations_createB | Create a channel. Slack refuses a name that is already taken. |
| notion_data_sources_queryB | Get the rows of a data source, optionally filtered and sorted. The filter grammar is one condition per column type, composed with |
| tavily_research_createA | Create an async research task that searches, analyzes sources, and generates a cited report. Poll results with research_get. |
| tavily_research_getA | Retrieve the status and results of a research task by request_id. HTTP 202 means still running; poll until HTTP 200. |
| stripe_customers_retrieveB | Retrieve a single customer by ID. |
| granola_notes_listA | List meeting notes, filtered by when they were created or last updated and optionally narrowed to one folder and its subfolders. Returns each note's id, title, owner and timestamps, not its content. Fetch that with notes_get. Only notes that already have a generated AI summary appear here. |
| notion_searchA | Search the titles of pages and data sources shared with this integration. Titles only — it does not search page content — and it returns nothing that has not been shared. With no query it lists everything visible, which is how you find the IDs to start from. |
| gdrive_files_listA | List the user's files. Returns all files by default, including trashed files; add |
| gdrive_files_exportA | Export a Google Workspace document to the requested MIME type and return the exported content. Limited to 10 MB. Common MIME types: text/plain, text/html, text/csv, application/pdf. |
| connectA | Connect one app this server uses. For an app that issues keys, says where to get one and the terminal command that stores it. For Google, once the user's own OAuth client is set, starts the browser sign-in and returns at once: the user approves in the browser and the next call works. To see which apps are connected, call |
| connection_statusA | See which apps this server is connected to, and how to connect each one that is not. Changes nothing. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| setup | Connect every app this server uses, the quickest way each one allows. |
| pre_call_brief_for_tomorrow_s_external_meetings | Company news, what they sell and the last email thread, in a DM the night before. |
| call_to_follow_up_email_and_next_step | The recap email is drafted, the next meeting held and the CRM updated before the rep leaves the room. |
| lead_list_enrichment | A column of domains becomes size, product, pricing model and a recent signal per row. |
| inbound_demo_request_to_booked | A qualified request gets a meeting and a researched AE within the hour. |
| scope_agreed_on_a_call_to_payment_link | The deal closes while the buyer still remembers saying yes. |
| signed_quote_to_stripe_invoice | The quote's line items become the invoice's, with no retyping. |
| closed_won_handoff | Account page, customer record and internal channel exist the day the deal closes. |
| target_account_research | Every account in the target list gets a cited brief on its page. |
| pipeline_digest | Deals with no meeting booked in two weeks get flagged to their owner. |
| trial_ending_to_rep_alert_and_nudge | Trials that end in three days get a human touch instead of a silent expiry. |
| no_show_recovery | A meeting with no notes was a no-show, and it gets a reschedule email. |
| security_questionnaire_prefilled | Two hundred rows answered from your own policies, for a human to review. |
| new_thread_from_an_unknown_domain_to_crm | Inbound that didn't come through a form still lands in the CRM with context. |
| mail_merge_from_a_sheet | Personalised drafts per row, status written back, nothing sent without review. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 35 tools
Most tools are clearly separated by app prefix and action, e.g. gmail_messages_send vs gmail_drafts_create. Some overlap remains among tavily_search, tavily_research_create, firecrawl_scrape, and firecrawl_extract, which could be confused for general web research tasks. Overall the set is mostly distinct but not perfectly unambiguous.
Tool names follow a highly predictable snake_case pattern, usually app/service/resource/action, such as notion_pages_create, stripe_invoices_finalize, and gcalendar_events_list. Minor deviations like connect and connection_status are meta-tools and do not break the pattern. The naming convention is consistent throughout.
With 35 tools, this is well above the typical 3-15 well-scoped range and exceeds the 25+ threshold for being too many. Although the server spans many integrations, the surface feels heavy and likely includes tools that could be consolidated or conditionally exposed. The count is not well-scoped for a single sales-prep agent.
Coverage is broad across apps but shallow and has significant gaps: Gmail can list threads but not read message bodies, Calendar can list/insert but not update/delete, and Linear only creates customers. granola_notes_get even references a notes_transcript_get tool that is not present, creating a dead end. These gaps would likely cause agent failures in real sales-prep workflows.