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 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:

Terminal
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. 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 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, sign in as the intended project principal, and confirm that principal may enable services in that project. Then enable both APIs:

Terminal
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; 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 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 advertises get_crm_objects and get_user_details. Its CRM MCP reference 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 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 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 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