Granola
Ops & Productivity 30 minutes

How to Draft Blog Posts from Your Customer Meetings

Build a blog-post drafter in Claude Code that turns Granola meetings into grounded drafts. Wire holds your voice and editorial rules. Granola holds the meetings.

Wire Granola

At a glance

  • You'll build a blog-post-drafter agent in Claude Code that pulls customer evidence from Granola meetings, mirrors your voice from past posts in Wire, and saves a markdown draft for your review.
  • Drafts always land as a local markdown file. Neither Granola nor Wire exposes a publish tool, so auto-publishing is architecturally impossible.
  • Wire holds what is NOT in your meetings. Past blog posts for voice, brand and product positioning, editorial rules, naming preferences, and the topic backlog.
  • Granola holds the customer conversations. Meeting notes, transcripts, attendees, dates. The agent queries Granola fresh on every draft.
  • Built for founders, marketers, and content teams who want posts grounded in real customer language instead of generic LLM filler.

What you need

  • A Wire account.
  • Claude Code with the Wire MCP and the Granola MCP both connected.
  • A Granola account. Basic plan works for last-30-days notes; Business or Enterprise unlocks full history and transcripts.
  • A handful of your past blog posts (markdown, exported from your CMS, or pasted in).
  • A short brand and editorial rules note: who you write for, what you call your product, anything you do not say.

Architecture

┌────────────────────────────┐   ┌──────────────────────────────┐
│ Granola (via MCP)          │   │ Wire container               │
│ • meeting list and search  │   │ • past blog posts (voice)    │
│ • meeting notes            │   │ • brand and product context  │
│ • transcripts (paid plans) │   │ • editorial rules + prefs    │
│ • attendees and dates      │   │ • topic backlog and history  │
└──────────────┬─────────────┘   └──────────────┬───────────────┘
               │                                │ Wire tools
               ▼                                ▼
        ┌────────────────────────────────────────────────┐
        │                 Claude Code                    │
        │   meeting search   →   container search        │
        │        ↓                      ↓                │
        │  customer evidence       voice and rules       │
        │        ↓                      ↓                │
        │     compose grounded markdown draft            │
        │        ↓                      ↓                │
        │  cite each claim back to a meeting + entry     │
        └────────────────────┬───────────────────────────┘
                             │
                             ▼
                    drafts/<topic-slug>.md
                    (you review, edit, publish)

Writing a blog post from a stack of customer calls usually means scrubbing through transcripts, copy-pasting quotes into a doc, opening an AI chat, pasting in your style guide, asking for a draft, then rewriting most of it because it sounds nothing like you. The agent has no memory of your voice or your editorial rules, so every post starts from zero.

This guide walks through building a blog-post drafter: a named workflow in Claude Code that reads your Granola meetings, pulls voice and editorial rules from a Wire container, and saves a markdown draft for you to review. Once the agent exists, your customer conversations become a writeable corpus instead of a pile of transcripts you keep meaning to do something with.

What you’re building

A blog-post drafter with two sources of truth and one output surface. You give it a topic. It searches your Granola meetings for relevant customer evidence, pulls past posts and editorial rules from a Wire container, drafts a post in markdown with footnotes citing every source, and saves it locally. You review the draft, edit, and publish on your own CMS.

Two data sources, one draft:

  • Granola (via the Granola MCP) holds the customer conversations. Meeting notes, transcripts, attendees, dates. The agent queries it fresh every time it drafts so the evidence is current.
  • Wire holds what is not in your meetings. Past blog posts for voice grounding, brand and product positioning, editorial rules and naming preferences, and your topic backlog so you do not write the same post twice.

The agent never publishes. Neither MCP exposes a CMS or send tool, so the only output is a markdown file you read before shipping.

How it works

Without grounded context, a generic AI draft for a topic like “common objections we hear from technical founders” looks like:

Technical founders often have concerns about adopting new tools. Common objections include integration complexity, security questions, and cost. It is important to address these proactively in the sales process.

With Granola meetings as evidence and a Wire container holding your voice and brand, the same agent produces:

The objection that comes up first in maybe four out of five technical-founder calls is “I do not want another vendor in the data path.” We hit this so often we now lead the demo with our self-host story instead of the pricing page. Drawn from three founder calls in the last 60 days.

What changed: the agent had real meeting evidence to ground the claim, a Wire entry telling it your house style runs short and opens with a specific number, and a clear path back to the source meetings if you want to verify before publishing.

Why Wire containers

Granola already has an MCP. Search meetings, list by date, pull transcripts. So why add Wire to the picture?

Granola holds evidence. Wire holds editorial. Your past blog posts, your brand voice, what you call your product, which customers cannot be named, what topics you have already covered. None of that lives in Granola, and a draft built only from raw meeting evidence reads like a transcript dump. Wire is where you put the things that turn evidence into something publishable.

One container, many agents. When you later build a sales objection report, a customer interview synthesizer, or a release-notes drafter, they all read from the same Wire container. The voice and brand entries you write once feed every downstream content workflow. You do not maintain three parallel style guides that drift apart.

Editorial rules survive. A Wire entry that says “anonymize customer Acme in public content” applies to every draft from now on. The agent reads the rule before each run. You do not have to remember to flag it in the prompt.

Setup

Three connections. All link to canonical docs so you pick the path that fits your stack.

1. Create a Wire container and seed it

Create a container and add: three or four of your past blog posts, a short brand and product context note (who you write for, what you call your product, your common framings), and any editorial rules (naming preferences for customers, terminology you avoid, links you always include). Add as files or paste as entries.

See Creating containers.

2. Connect Wire to Claude Code

Add the Wire MCP to Claude Code so the agent can search your container.

See Claude Code + Wire MCP.

3. Connect Granola to Claude Code

Connect the Granola MCP. It uses browser OAuth, no client secrets needed.

See Granola MCP setup.

Usage

Once the three connections are live, the agent runs from a single prompt in Claude Code. Paste this whenever you want a draft on a specific topic:

I want to draft a blog post on the topic: <YOUR TOPIC HERE>.

Use the Granola MCP and the Wire MCP to do this. Do not invent facts.
Every claim in the draft must trace to either a meeting in Granola or
an entry in Wire. Footnote every claim with its source.

1. Search my Wire container for any editorial rules, brand and product
   context, and the topic backlog. Apply the rules before drafting:
   honor my naming preferences, use my preferred terminology, follow
   any structural patterns in my voice notes. If the topic is already
   on the shipped list, surface that and ask whether I want a follow-up
   angle or a different topic before continuing.

2. Search Granola for meetings relevant to the topic. Skip internal
   meetings, recruiting calls, and partner conversations. Pull notes
   and, where available, transcripts from the most relevant customer
   or prospect meetings. Aim for at least three meetings as evidence.
   If fewer than two meetings cover the topic, stop and tell me, do
   not draft on thin evidence.

3. Search my Wire container for three or four of my past blog posts.
   Read them before drafting to match my sentence rhythm, structure,
   sign-off, and any phrasing I reuse. Do not copy any post verbatim.

4. Compose a draft that:
   - Opens with a specific observation grounded in a meeting, not a
     general statement.
   - Uses real customer language. Anonymize where a naming-preference
     rule applies.
   - Sounds like my past posts. Match voice precisely.
   - Footnotes every factual claim back to a Granola meeting (with
     date and attendees, anonymized as needed) or a Wire entry.
   - Stays the length of my typical posts. Do not pad.

5. Save the draft to drafts/<topic-slug>.md as markdown.

6. Update my topic backlog in Wire with this topic, marked as drafted
   but not shipped.

When done, tell me:
- The path to the saved draft.
- The list of meetings used as evidence (date, anonymized attendee).
- Which editorial rules you applied.
- Anything you wanted to claim but could not source. I should know
  what is missing before I edit.

That is the whole thing. Paste it into Claude Code with a topic, review the markdown draft it saves, edit, and ship from your CMS.

Closing the loop

The skill closes the loop on its own. At the start of every run, it scans your drafts/ folder for any markdown file with an open topic-drafted entry in Wire. It treats your latest edits to the file as the final version, ingests that markdown as a new voice-corpus entry, and marks the topic archived in your backlog. No URL, no slug, nothing for you to copy. Future drafts mirror your latest writing instead of drafting against an aging corpus.

We simplified the whole flow into a one-command skill. Download it below and run it with /blog-post-drafter instead of pasting the long prompt every time.

The agent, as a skill

blog-post-drafter

Confirms Granola and Wire are connected, then drafts a blog post for a topic you give it. Searches your meeting history for evidence, mirrors your house voice from past posts, and saves a markdown draft for review.

We'll send occasional product updates. No spam. By downloading, you agree to our privacy policy.

Tips and patterns

What the skill takes care of.

Cites every claim back to a meeting and a Wire entry.

The skill requires the agent to ground any factual claim in either a Granola meeting or a Wire entry. Every paragraph carries a footnote pointing to its source so you can verify before publishing.

Filters out non-customer meetings.

Internal standups, recruiting, demos, and partner calls are excluded from the evidence pool. The skill scopes searches to actual customer or prospect conversations.

Respects naming preferences from Wire.

If your Wire container holds a `do-not-name:<customer>` rule, the agent anonymizes that customer in the draft. Your editorial calls about who gets named carry across every run.

Mirrors your house voice from past posts.

The skill reads several of your past posts before drafting and matches sentence rhythm, structure, and vocabulary. Generic LLM cadence does not survive the pass.

Reports gaps when evidence is thin.

If fewer than two meetings cover the requested topic, the skill stops drafting and tells you so. You get a clear signal to either pick a different topic or wait until more calls land.

Skips topics already on your published list.

The skill checks the topic backlog in Wire. If you have already shipped a post on this angle, it surfaces the existing post and asks whether you want a follow-up or a different angle.

Troubleshooting

If something's off.

Claude Code says it cannot see Granola.
The Granola MCP is not connected for this session. Open Granola, follow the MCP setup at https://docs.granola.ai/help-center/sharing/integrations/mcp to connect via browser OAuth, then restart Claude Code. Run `/mcp` to confirm Granola tools are listed.
Drafts read like generic AI content despite the Wire setup.
Your container does not have enough past blog posts for voice grounding. Add at least three full posts you would want the agent to sound like. Paste them as entries or upload as files. Voice mirroring needs real material to copy from.
The agent quotes a customer you did not want named.
Add an editorial rule entry to Wire: a short note like 'Do not name customer Acme in published content. Anonymize as a similar-stage company.' The agent reads these rules before drafting and applies them. Re-run with the topic and the rule will be honored.
The agent reports no relevant meetings even though you know they exist.
On Granola Basic, the MCP is limited to the last 30 days and does not include transcripts. Move to a paid plan to unlock full history and transcript access, or scope your topic to recent meetings.
Two drafts have nearly identical content.
The skill checks the topic backlog in Wire to avoid repeats. If duplicates appear, your topic backlog entry is missing or outdated. Either let the agent record the topic on first draft (it will offer to), or add a `topic-shipped: <slug>` entry yourself.
The draft is short and surface-level.
Either the topic is too narrow for the corpus, or the Wire brand and product context entries are thin. Add more product positioning detail to Wire (what you do, who it is for, your common framings) so the agent has shape to work with.

Common questions

Why do I need Wire if Granola's MCP can already search my meetings?
Because the editorial layer is not in Granola. Your past blog posts, brand voice, what you call your product, who you do not name, what topics you have already covered. Granola gives the agent customer evidence. Wire gives it everything that turns evidence into a publishable post in your voice. Both are needed; neither alone produces a draft you would actually ship.
Does this ever publish a post on its own?
No. Drafts land as a local markdown file. Neither the Granola MCP nor the Wire MCP exposes a publish tool. Auto-publish is not prompt-forbidden here, it is architecturally impossible. You review the draft, edit, and ship it on your own CMS.
What if I do not have past blog posts to seed voice?
Add three or four. They do not have to be polished, just representative. If you genuinely have none, you can add a short voice-style note to Wire instead: 'Write in second person, short sentences, no jargon, dry humor, never start with a question.' That gives the agent a shape to follow until you have real posts to point at.
Can I use this on Granola's Basic plan?
Partially. Basic exposes the last 30 days of notes and no transcripts. That is enough to draft a recap-style post about recent themes but not enough for a deep-dive grounded in a quote from three months ago. For ongoing content production, the paid plans pay for themselves quickly.
How does the agent know which customers to name and which to anonymize?
You tell it once, in Wire. Add an editorial entry listing your naming preferences: 'name Acme freely', 'anonymize Beta Co as a similar-stage SaaS', 'never use Customer Gamma in public content'. The agent reads those before every draft. Wire is the single source of truth so the rules do not get lost between posts.
How often should I update Wire?
Whenever your voice or positioning changes, or when you ship a new post. The skill can record shipped topics for you on the way out, so the backlog stays current without extra work. Add new editorial rules as they come up rather than batching them.

Start building with Wire.

Create your first container in under a minute. No credit card required.

Create Your First Container