# Make a checked Gmail follow-up draft from Notion and HubSpot
> Connect Notion, HubSpot and Gmail to Claude Code, reconcile an approved brief with exact CRM and email records, and verify one human-reviewed Gmail follow-up draft.
By BIGCHANGE.AI Editorial
Published: 2026-10-22T12:00:38.788Z
Updated: 2026-10-22T12:00:38.788Z
Canonical: https://bigchange.ai/blog/notion-hubspot-gmail-checked-follow-up-draft-guide

AI-generated conceptual illustration by BIG CHANGE.
You have an approved customer brief in Notion, the contact and deal in HubSpot, and an email conversation in Gmail. This guide uses Claude Code to read those exact records, reconcile what may be said, and save one follow-up in Gmail Drafts. A person checks the full saved draft before any separate decision to send it. The procedure depends on the tools and permissions actually available in your accounts; BIG CHANGE has not run it on a customer record.
## The big change
- **What changed:** Claude Code can use a direct Notion MCP connection and inherit authenticated HubSpot and Gmail connectors from the same Claude.ai subscription login.
- **Why it matters:** The writer can compare a brief, CRM records and the actual email thread before composing one draft, then use Gmail's draft readback to inspect what was saved.
- **What to watch:** Connector access is broader than the records named in a prompt. Confirm the account and grants, get approval for the exact recipients and text, and treat a timed-out draft write as unknown until Drafts has been inspected.
This is a documentation-based workflow for an operator who owns or is authorized to use all three services. You need the approved Notion page URL or ID and revision, the intended HubSpot portal and exact contact/deal IDs, the Gmail mailbox and thread ID, a reason to follow up, a recipient address, facts permitted for disclosure, and a human approver. Do not use a sample customer's details or let a search result decide which person is meant. Keep IDs, content, credentials, tool traces and the review record private.
### 1. Check access before reading
Use a [supported Claude Code account](https://code.claude.com/docs/en/mcp#use-mcp-servers-from-claudeai) and check its current plan, usage and an owner-approved usage limit. Confirm that your organization permits the selected business records to reach the Claude account and each service. Naming one page, contact and thread in the prompt limits the *requested work*; it does not narrow the connector's credential grant. Inspect the real grants and tool permissions. Do not place secrets in a prompt, shell argument or project file.
In a controlled Claude Code project, connect the [official Notion MCP server](https://developers.notion.com/guides/mcp/get-started-with-mcp):
```sh
claude mcp add --transport http notion https://mcp.notion.com/mcp
```
Open `/mcp`, complete OAuth for the intended workspace, and inspect the authenticated status and available tools. Ask Claude to call `notion-get-self` with `{}`. Compare `workspace.id`, `workspace.name`, `user.id`, `user.type` and any returned email to the intended identity. You need `notion-fetch` for the approved page. A workspace-managed connection may expose only the administrator's selected tools. A page URL does not create a page-only permission grant.
For HubSpot, use the [official HubSpot connector for Claude](https://knowledge.hubspot.com/integrations/set-up-and-use-the-hubspot-connector-for-claude). It requires an active HubSpot user and a paid Claude Pro, Max, Team or Enterprise subscription. A HubSpot Super Admin or user with App Marketplace Access can connect; otherwise a Super Admin must first approve the app, its data permissions and installers. In the intended Claude.ai account, choose **profile → Settings → Connectors → Browse → HubSpot → Connect**. Select and sign into the intended HubSpot portal, review the permission screen, choose the administrator-approved grants, then select **Connect app**. A Claude account can connect to only one HubSpot account at a time. Set the connector's **Write tools → Needs Approval**. This guide calls for no CRM write.
Sign in to Claude Code with that *same* Claude.ai subscription login. Anthropic says the account's Claude.ai connectors are automatically available in Code. Check `/status` and `/mcp`; expand **Show unused connectors** if necessary. Confirm authenticated HubSpot tools and their Claude.ai origin, then compare the selected portal and user with your approved records. API-key, auth-token, third-party-provider, profile and setup-token authentication do not load Claude.ai connectors into Code. HubSpot permissions and Sensitive Data settings can withhold records or engagement fields even when the connector is listed.
Google's [Gmail MCP configuration](https://developers.google.com/workspace/gmail/api/guides/configure-mcp-server) is in Workspace Developer Preview. Your organization needs preview enrollment, an approved Google Cloud project and permission to connect the intended mailbox. To run the commands below, [install and initialize the Google Cloud CLI](https://developers.google.com/workspace/gmail/api/guides/configure-mcp-server), sign in as the intended project principal, and confirm that principal may enable services in that project. Then enable both APIs:
```sh
gcloud services enable gmail.googleapis.com --project=PROJECT_ID
gcloud services enable gmailmcp.googleapis.com --project=PROJECT_ID
```
The same Google guide offers Cloud Console links to enable the Gmail API and Gmail MCP service if you do not use the CLI. In Google Auth Platform, configure Branding, Audience and Data Access. Choose Internal where available, or External with the actual authorized test users. Add `https://www.googleapis.com/auth/gmail.readonly` and `https://www.googleapis.com/auth/gmail.compose`, and review the consent screen. Create a **Web application** OAuth client with redirect `https://claude.ai/api/mcp/auth_callback`; select **Use this client for an AI-powered agent**. In **Claude.ai or Claude Desktop → Settings (or Admin settings) → Connectors → Add custom connector**, enter a name such as `Gmail`, URL `https://gmailmcp.googleapis.com/mcp/v1`, and the client ID and secret in Advanced settings. Authenticate the intended mailbox in Claude.ai. Back in Claude Code under the same subscription login, check `/status` and `/mcp`, including **Show unused connectors**, for the Claude.ai-origin Gmail connection and `get_thread`, `create_draft` and `list_drafts`. [Google describes `gmail.compose` as permission to manage drafts *and send emails*](https://developers.google.com/workspace/gmail/api/auth/scopes); this procedure calls only `create_draft` and never a send tool.
If OAuth or a connector fails, inspect the chosen Claude.ai/Google/HubSpot account, the registered Google callback, both enabled Google services and consent scopes, and HubSpot administrator approval, current grants and live tool catalog. Resolve the specific mismatch, then read back connection status and identity. Do not repeat a draft write while its outcome is unknown.
### 2. Read the three exact records
Before a write, ask Claude to use only advertised read tools. This bounded prompt is a starting point; replace bracketed values with real IDs in your private session and inspect each proposed call:
```prompt
For my approved follow-up, use the authenticated Notion, HubSpot and Gmail connectors only. Call notion-get-self with {} and notion-fetch for [approved page URL or ID]. Inspect the inherited HubSpot connector's actual tool names and input schemas, identify my intended portal, and read exact contact ID [contact ID] and deal ID [deal ID]. Call Gmail get_thread with threadId [thread ID] and messageFormat FULL_CONTENT. Report each tool outcome, identity, revision and a source table. Make no writes. If a record, tool, field or permission is absent, stop and describe that specific gap.
```
The [Notion tool reference](https://developers.notion.com/guides/mcp/mcp-supported-tools) says `notion-fetch` returns `path` and `page_last_edited_at`; compare them with the approved brief. If `truncated:true`, fetch the relevant `unknown_block_ids` subtrees and account for `unknown_block_count`, which can exceed the first 50 listed IDs. Do not call a partial read complete. `object_not_found` may indicate a missing grant.
HubSpot's [Claude Marketplace connector catalog](https://claude.com/marketplace/connectors/hubspot) advertises `get_crm_objects` and `get_user_details`. Its [CRM MCP reference](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) defines exact-ID retrieval with `get_crm_objects` and documents `tool_guidance` and `discover_hubspot_schema`. Inspect the *inherited* tools and their live input schemas first. If those names are present, use account/user details, tool guidance and schema discovery to identify contact/deal types and fields, then pass the owner's exact IDs using the advertised argument names. If the inherited catalog differs, use only an advertised read tool that supports those exact IDs. Verify returned IDs, material properties, contact/deal association and portal in HubSpot's own interface. A name-search match cannot replace this check. If no exact-ID read is available, hold the CRM source check.
Use Gmail [`get_thread`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/get_thread) with the exact `threadId` and `messageFormat: FULL_CONTENT`. Read every relevant message body, participants and attachment IDs. Open that conversation in Gmail too. A snippet or thread title is not the conversation. Compare the Notion page, HubSpot contact/deal and Gmail participants with the approved customer and purpose. Where a brief, CRM property and email disagree, have the record owner resolve the conflict. Do not infer price, consent, stage, date or recipient from the model's prose.
### 3. Approve the exact message
Make a private sentence-by-sentence evidence table for the proposed subject and *new* body. For every material statement, record its Notion block, HubSpot property/record or Gmail message ID, source revision or timestamp, and whether the recipient may receive it. Mark instructions from the owner separately from observed customer facts. Reconcile a change in any source before approving the draft. The human reviewer must approve the exact subject, new plain-text body, To addresses and any Cc or Bcc addresses; leave Cc and Bcc empty unless expressly approved.
Ask for a review packet before approving any write:
```prompt
Using only the exact records read above, propose one follow-up subject and new plain-text body. For each factual sentence, show the source record ID, field/block/message ID, revision or timestamp, and disclosure permission. Show the selected To, Cc and Bcc arrays, whether this is standalone or a reply, and the original message ID and quoted material if replying. Mark every conflict or missing permission as HOLD. Do not create a draft.
```
Decide whether this is a standalone message or a reply. A reply needs the specific original *message ID* from the thread, which differs from the thread ID. Google's [`create_draft`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/create_draft) reference says a reply's new body is appended to the original message body. Show the reviewer any original or quoted text and attachments that may travel with it. If older content is not approved for disclosure, use a standalone draft or hold. This procedure sets no new attachments; Google's tool reference says attachment creation is not yet supported.
Before the tool call, keep a private intent record with mailbox, page/contact/deal/thread IDs and revisions, all recipients, complete approved text, reply message ID if used, reviewer, approval time and a content hash. Compare the actual proposed `create_draft` arguments with that record. Call `create_draft` **once** with the approved `to`, `subject` and `body`, adding `cc`, `bcc` or `replyToMessageId` only where approved. This is a write to Gmail Drafts. It does not send the message.
For a standalone message, the approved tool arguments have this shape. Fill the fields from the private approval; do not paste the explanatory brackets into a real call:
```json
{
"to": ["[approved recipient address]"],
"subject": "[exact approved subject]",
"body": "[exact approved new plain-text body]"
}
```
Replace every bracketed value before calling the tool. Add `cc` or `bcc` only for approved arrays. For a reply, add `replyToMessageId` with the actual original message ID after the reviewer has approved likely quoted content. Use the live Gmail tool schema if it differs from this documented reference; hold rather than guess an argument.
### 4. Read back the saved draft
Record the returned **draft ID**, which is not a message ID. The tool's response is not a substitute for reading the saved item. Call Gmail [`list_drafts`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/list_drafts) with `view: "DRAFT_VIEW_FULL"` and `pageSize: 50`. Follow every `nextPageToken` with `pageToken` until the exact draft ID is found or the relevant list is exhausted. A search filter may help narrow candidates, but zero filtered hits do not prove no draft was written.
For that ID, check the saved `threadId`, To, Cc, Bcc, subject, entire plain-text and HTML body, date and attachment state against the intent record. For a reply, compare the whole body, including the approved new text and appended original or quoted material. Open the exact draft in Gmail if a field is missing or ambiguous. The human reviewer passes the *saved* content only when those checks and the three source identities agree. Record the draft ID, readback time and approval revision. Sending requires a separate decision.
If `create_draft` times out or its result is lost, mark the write **unknown**. Inspect Gmail Drafts and the thread, including the full paginated list and UI, before considering any repeat. If a saved field differs, leave the draft for its owner to correct or discard under normal mailbox authority. Do not create another draft to clear an uncertain response.
The connector setup and model usage may incur costs under the reader's plans; check the current account terms before work. BIG CHANGE has not connected these accounts, measured a bill or created a customer draft. This procedure stops at one reviewed saved draft. Automatic sending, recurring synchronization and changes to HubSpot or Notion need separate work and approval.
## Sources & further reading
- [Anthropic's Claude Code MCP manual](https://code.claude.com/docs/en/mcp#use-mcp-servers-from-claudeai) explains Claude.ai connector inheritance, `/mcp` discovery and login limitations.
- [Notion's MCP setup](https://developers.notion.com/guides/mcp/get-started-with-mcp) and [supported tools](https://developers.notion.com/guides/mcp/mcp-supported-tools) document OAuth, identity, fetching and truncated pages.
- [HubSpot's Claude connector setup](https://knowledge.hubspot.com/integrations/set-up-and-use-the-hubspot-connector-for-claude), [public connector catalog](https://claude.com/marketplace/connectors/hubspot) and [CRM MCP tool reference](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) establish the managed connection and exact-ID read capability. Your live catalog and permissions determine what you can call.
- [Google's Gmail MCP configuration](https://developers.google.com/workspace/gmail/api/guides/configure-mcp-server) and the [`get_thread`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/get_thread), [`create_draft`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/create_draft) and [`list_drafts`](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/list_drafts) references give the preview setup, draft semantics and saved-item readback.
- Related BIG CHANGE coverage: [a checked Gmail triage agent for Linear and Slack](https://bigchange.ai/blog/checked-gmail-triage-linear-slack-guide) handles a different input and outcome.
## Sources
- [Anthropic Claude Code MCP manual](https://code.claude.com/docs/en/mcp#use-mcp-servers-from-claudeai) — Claude.ai connector inheritance and Code identity checks.
- [Notion MCP setup](https://developers.notion.com/guides/mcp/get-started-with-mcp) — Direct MCP command and OAuth.
- [Notion MCP supported tools](https://developers.notion.com/guides/mcp/mcp-supported-tools) — Identity, page fetch and truncation.
- [HubSpot Claude connector setup](https://knowledge.hubspot.com/integrations/set-up-and-use-the-hubspot-connector-for-claude) — Managed connector, subscription and permissions, updated 19 October 2026.
- [Claude HubSpot connector catalog](https://claude.com/marketplace/connectors/hubspot) — Public managed connector listing includes get_crm_objects and get_user_details.
- [HubSpot CRM MCP tool reference](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) — Exact-ID read and tool/schema guidance; live inherited schema must be inspected.
- [Google Gmail MCP configuration](https://developers.google.com/workspace/gmail/api/guides/configure-mcp-server) — Preview, APIs, consent, OAuth client and Claude.ai connection.
- [Google Gmail API scopes](https://developers.google.com/workspace/gmail/api/auth/scopes) — gmail.compose grants managing drafts and sending mail; this guide performs only draft creation.
- [Google get_thread](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/get_thread) — FULL_CONTENT conversation read.
- [Google create_draft](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/create_draft) — Draft ID, reply semantics and attachment limit.
- [Google list_drafts](https://developers.google.com/workspace/gmail/api/reference/mcp/tools_list/list_drafts) — DRAFT_VIEW_FULL pagination and saved-item fields.
The BIG CHANGE newsletter
The big picture. At your pace.
Recent stories on AI and robotics, the shifts worth watching and practical ideas to use. Choose a daily briefing, weekly digest or monthly perspective.
Next scheduled send (UTC): . Your first edition arrives at the next scheduled send after you confirm.
Your privacy, your choice.
Necessary storage supports site security and remembers your choices. Optional Google Analytics stays off until you allow it. You can read every story with necessary storage only. Privacy details