All workflows

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. 1

    Search Notion

    Notion

    Search for question's key terms across your enablement pages. Keep each matching page's title, URL and content.

  2. 2

    Search Slack

    Slack

    Search the same terms for past discussion that already answered this. Keep matching messages with their channel and permalink.

  3. 3

    Search the CRM

    HubSpot

    When question names an account or deal, search for the matching record. Keep whatever properties or notes bear on the question.

  4. 4

    Draft a cited answer

    Anthropic

    Answer question strictly from what steps 1 to 3 returned, citing the source for every claim. If nothing covers it, say so plainly rather than guessing.

  5. 5

    Post the answer

    Slack

    Reply in question_channel with the answer and its citations, or the "no source covers this" note.

  6. 6

    Log the gap

    Notion

    When no source covered question, add a row to gap_database with the question and question_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-gtm
  • gap_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-search on 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:write scope. 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)

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

  1. 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.
  2. 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.
  3. Search the CRM with Search CRM records (HubSpot). When question names an account or deal, search for the matching record. Keep whatever properties or notes bear on the question.
  4. Draft a cited answer with Create a message (Anthropic). Answer question strictly 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 with Post a message (Slack). Reply in question_channel with the answer and its citations, or the "no source covers this" note.
  6. Log the gap with Create a page (Notion). When no source covered question, add a row to gap_database with the question and question_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.