sby @shipgtm
Answer a GTM question from Notion, Slack and HubSpot
Searches your docs, past conversations and CRM for the answer, drafts a cited response with Claude, and posts it back in Slack.
Outcome
A cited answer, drawn only from Notion, Slack and HubSpot, posted back in the channel the question came from.
A plain "no source covers this" instead of a guess when nothing matches.
Unanswered questions logged in Notion for the team to fill.
How it works
- 1
Search Notion
NotionSearch for
question's key terms across your enablement pages. Keep each matching page's title, URL and content. - 2
Search Slack
SlackSearch the same terms for past discussion that already answered this. Keep matching messages with their channel and permalink.
- 3
Search the CRM
HubSpotWhen
questionnames an account or deal, search for the matching record. Keep whatever properties or notes bear on the question. - 4
Draft a cited answer
AnthropicAnswer
questionstrictly from what steps 1 to 3 returned, citing the source for every claim. If nothing covers it, say so plainly rather than guessing. - 5
Post the answer
SlackReply in
question_channelwith the answer and its citations, or the "no source covers this" note. - 6
Log the gap
NotionWhen no source covered
question, add a row togap_databasewith the question andquestion_channel, for the team to write an answer.
You'll be asked for
The question a rep asked, in their words
e.g. does the Enterprise plan support SSO?
The Slack channel to post the answer back to
e.g. #ask-gtm
The Notion database that tracks unanswered questions
e.g. GTM content gaps
The file your agent runs
gtm-knowledge-answers.md
Answer a GTM question from Notion, Slack and HubSpot
Searches your docs, past conversations and CRM for the answer, drafts a cited response with Claude, and posts it back in Slack.
Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.
Outcome
- A cited answer, drawn only from Notion, Slack and HubSpot, posted back in the channel the question came from.
- A plain "no source covers this" instead of a guess when nothing matches.
- Unanswered questions logged in Notion for the team to fill.
Inputs
Ask the user for these before you start.
question: the question a rep asked, in their words, e.g. does the Enterprise plan support SSO?question_channel: the Slack channel to post the answer back to, e.g. #ask-gtmgap_database: the Notion database that tracks unanswered questions, e.g. GTM content gaps
Set up
Notion (tool:notion/search-workspace, tool:notion/create-page)
Use the first option your agent supports.
Notes:
- Search the workspace: Over the API, matches only the titles of pages and data sources the token can reach;
notion-searchon the MCP server also searches page content. - Create a page: To add a row to a database, set the parent to its data source and match that data source's property schema.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "notion": { "url": "https://mcp.notion.com/mcp" } } }
- Search the workspace: call the MCP tool
notion-search - Create a page: call the MCP tool
notion-create-pages
CLI (official)
Install the command, then confirm it runs.
npm install --global ntn
ntn --version
- Search the workspace: run
ntn api v1/search - Create a page: run
ntn api v1/pages
Set $NOTION_API_TOKEN in your environment first (get a key: https://www.notion.so/developers/tokens).
Slack (tool:slack/search-messages, tool:slack/post-message)
For each call, use the first option your agent supports that lists it.
Notes:
- Post a message: Needs the
chat:writescope. Over MCP it posts as the signed-in user; the API and CLI post as the app's bot.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "slack": { "url": "https://mcp.slack.com/mcp" } } }
- Search messages: call the MCP tool
slack_search_public - Post a message: call the MCP tool
slack_send_message
CLI (official)
Install the command, then confirm it runs.
curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash
slack --version
- Post a message: run
slack api chat.postMessage
Set $SLACK_BOT_TOKEN in your environment first (get a key: https://api.slack.com/apps).
Search CRM records (HubSpot, tool:hubspot/search-crm-records)
Use the first option your agent supports.
Note: The MCP tool takes up to five groups of six filters and returns up to 200 records per page.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "hubspot": { "url": "https://mcp.hubspot.com" } } }
Call the MCP tool search_crm_objects.
API (official)
- Base URL: https://api.hubapi.com
- Endpoint:
POST /crm/objects/2026-09/{objectType}/search - Auth: send the header
Authorization: Bearer $HUBSPOT_API_KEY
Note: Use a service key or an app's static access token with the CRM scopes the calls need; paths carry a dated version such as 2026-09.
Create a message (Anthropic, tool:anthropic/create-message)
Use the first option your agent supports.
Note: The API call needs the anthropic-version: 2023-06-01 header alongside the key, and max_tokens is required in the body.
CLI (official)
Install the command and sign in with it, then confirm it runs.
curl -fsSL https://claude.ai/install.sh | bash
claude --version
Run claude -p.
API (official)
- Base URL: https://api.anthropic.com
- Endpoint:
POST /v1/messages - Auth: send the header
x-api-key: $ANTHROPIC_API_KEY - Get a key: https://platform.claude.com/settings/keys
Before step 1, confirm access to each service with its cheapest read-only call, like a list or a search. Never send or change anything to test access.
Steps
- Search Notion with Search the workspace (Notion). Search for
question's key terms across your enablement pages. Keep each matching page's title, URL and content. - Search Slack with Search messages (Slack). Search the same terms for past discussion that already answered this. Keep matching messages with their channel and permalink.
- Search the CRM with Search CRM records (HubSpot). When
questionnames an account or deal, search for the matching record. Keep whatever properties or notes bear on the question. - Draft a cited answer with Create a message (Anthropic). Answer
questionstrictly from what steps 1 to 3 returned, citing the source for every claim. If nothing covers it, say so plainly rather than guessing. - Post the answer with Post a message (Slack). Reply in
question_channelwith the answer and its citations, or the "no source covers this" note. - Log the gap with Create a page (Notion). When no source covered
question, add a row togap_databasewith the question andquestion_channel, for the team to write an answer.
Notes
The answer is only as current as the pages, threads and records it cites; keep gap_database reviewed so the next person asking the same question gets a real source instead of another gap.
Adapted from ShipGTM's GTM knowledge base build guide, which names Slack and Notion as its two core sources with HubSpot's CRM data ingested alongside them.
Rules
- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.