vercel-labs/marketing-team-eve-template: Team of marketing agents built on eve. Contribute to vercel-labs/marketing-team-eve-template develop

github.com · 2026-08-04 · by Long Nguyen ·github
Team of marketing agents built on eve. Contribute to vercel-labs/marketing-team-eve-template development by creating an account on GitHub.

vercel-labs/marketing-team-eve-template

Team of marketing agents built on eve. Contribute to vercel-labs/marketing-team-eve-template development by creating an account on GitHub.

297 stars · 11 forks · 0 watchers

README

Marketing Team eve Template

Team of marketing agents built on eve. You bring work to a team lead: a launch to plan,posts to write, or a page that isn't converting. The lead holds the shared picture of the product, routes the request to the specialist who does that kind of work, and hands back what they produced.

The team

Specialist Owns Hands back

product-marketer Positioning, messaging, competitive alternatives, and the shared brand context document The brand context document itself

content-marketer Long-form: blog posts, landing pages, case studies, newsletters, docs A Notion page link

social-media-coordinator Short-form for X, LinkedIn, Threads, Bluesky, and Mastodon, plus the Typefully queue Drafts in Typefully

seo Page and site audits, hierarchy and internal linking, JSON-LD schema, templated page sets Recommendations, long audits as artifacts

email Reworking existing copy to survive an inbox, then building, targeting, and sending in Resend A Resend campaign link

The dependency runs one way. The product marketer writes the brand context; everyone else reads it at the start of every task. That makes it the one piece of shared state whose quality bounds everything else, which is why a single specialist owns authoring it. The specialists do not overlap by accident. The product marketer decides what the team claims, the content marketer writes the words, seo decides which pages should exist, and social-media-coordinator and email are the two that can put something in front of an audience. One request routes twice A newsletter is the case where two specialists chain. The content marketer authors the prose; the email specialist reworks it for the inbox and runs Resend. Splitting it this way keeps the newsletter inside the planning and editing passes the content marketer already runs, instead of growing a second, thinner writer. How it works

One lead that delegates, not a generalist. The root agent loads the brand context and this user's standing preferences, then briefs one specialist with everything it needs. It does not write the deliverable. Subagents inherit nothing. Every specialist runs in a fresh child session: no conversation history, no parent skills, tools, or connections. That is why the lead's instructions are mostly about writing a complete brief, and why each specialist loads the brand context again through its own get_brand_context. The tree is one level deep, deliberately. A specialist that finds its own evidence knows when it has enough, and one that edits its own draft against a written rubric catches most of what a second reader would. Each hop costs a full context handoff, so the lead delegates and specialists do not. Research and editing are part of the craft. Each specialist uses web_search and web_fetch against a source budget, then edits in deliberate passes before handing work back. Skills load on demand. Each skill is a SKILL.md plus reference files, pulled in only when its frontmatter description matches the situation. No registry file. A tool's name is its filename, a subagent's name is its directory name. eve walks agent/ at build time. Adding a specialist means adding a directory.

Publishing pauses for a human Every irreversible action stops for an approve or deny decision, rendered as a button in Slack or the TUI.

Action Pauses

Send a Resend broadcast, email, or batch Always, scheduled or not

Delete a Resend broadcast, template, contact, segment, or topic Always

Change a contact's topic subscriptions Always

Delete a Typefully draft, thread, or comment Always

Create or edit a Typefully draft Only when the draft is published

Move pages or change views in Notion Always

Create or update a Notion page No, drafting is the normal flow

delete_asset, clear_user_preferences Always

save_brand_context No, by design. The tool description tells the model to agree the document with you first

The Resend connection goes one step further than gating. It narrows what the model can discover at all with tools.allow, cutting roughly 85 published tools to the 47 that make up the campaign, list, and diagnostic surface. Account administration such as API key creation and domain writes is never on the table. Slack opens with suggested prompts Opening a fresh conversation with the team pins four starting prompts. Slack renders at most four, so it is one per specialist rather than a tour of the whole team.

Prompt Routes to

Sharpen our positioning product-marketer

Write a blog post content-marketer

Draft social posts social-media-coordinator

Review a page's SEO seo

Each one names the deliverable, asks for the brand context and your preferences, then hands the interview back, so an unspecified request costs one question rather than a wasted delegation. This requires assistant:write under Bot Scopes and the assistant_thread_started and app_home_opened trigger event types. Without them the prompts never appear, and the rest of the channel is unaffected. Deploy

The deploy button helps you provision and wire up everything:

Provisioned Sets

Notion connector NOTION_CONNECTOR

Resend connector RESEND_CONNECTOR

Slack connector, with its trigger pointed at eve's Slack route (/eve/v1/slack) SLACK_CONNECTOR

Vercel Blob store Blob credentials

Prompt for the Typefully API key TYPEFULLY_API_KEY

Then talk to the lead in the dev TUI or your own front end, and it routes work to the specialists. One manual step Resend sending. Verify a sending domain and create at least one segment in the Resend dashboard. The agent reads that state and picks from it, but cannot create a domain or verify DNS for you. The Resend connector is user-scoped, so each person authorizes their own login the first time they ask for email work, and sends are attributed to whoever approved them. Skip if you are not using email. Quick start with an AI coding agent Working in Claude Code or Cursor? Paste this: I want to build a team of marketing agents with the eve framework, using the marketing team template. Read the setup instructions at https://agent-resources.dev/marketing-team-eve-template.md and follow them. They will cover deploying the template, building with eve, how everything works overall, and more.

Tech stack

Layer Technology

Agent framework eve

Language TypeScript (strict, ESM), Node 24.x

Chat surfaces Slack via Vercel Connect, the eve dev TUI, your own front end

Long-form deliverables and briefs Notion (MCP)

Social publishing Typefully (MCP)

Email campaigns Resend (MCP)

Shared state and files Vercel Blob

Model access Vercel AI Gateway

Skill reference files and bash Vercel Sandbox

Lint and format Ultracite, a Biome preset

Credentials: one static key

Service Authenticates as You manage

Notion Each user, OAuth via Vercel Connect Connector UID only

Resend Each user, OAuth via Vercel Connect Connector UID only

Slack Bot token brokered by Vercel Connect Connector UID only

Typefully One shared workspace key TYPEFULLY_API_KEY

Vercel Blob Project OIDC token Nothing

AI Gateway Project OIDC token Nothing

Typefully's MCP server only accepts a static key, so it is the single credential in the project and its connection is shared across all users. Resend is the one place per-user scoping earns its keep. Sending is the only thing this team does that cannot be undone, so a per-user token means the approval names who agreed to it and Resend records who sent it, instead of every campaign arriving from one shared workspace key. Project layout agent/ agent.ts # lead: model and compaction threshold instructions.md # lead behavior: ground, route once, hand back sandbox.ts channels/ eve.ts # inbound route for the TUI and your own front end slack.ts # inbound route for Slack connections/notion.ts tools/ # brand context, user preferences, read_artifact lib/ # shared factories, imported as #lib/<domain>/<file>.js vercel-blob/ # Blob key layout and the 5 asset tool factories brand-context/ # the shared document's key and tool factories user-preferences/ # principal-scoped key and size cap content/ # lint_against_style, save/read_artifact writing-quality/ # the shared prose-rules skill subagents/ product-marketer/ content-marketer/ social-media-coordinator/ seo/ email/

Every specialist directory holds the same shape: an agent.ts with the routing description, an instructions.md, its own sandbox.ts, a tools/ with the five asset tools plus get_brand_context and the artifact tools, a bash.ts that disables the shell, and its own skills/.

Specialist Skills Connections

product-marketer positioning, messaging, customer-research, brand-context Notion

content-marketer blog-style, content-planning, content-editing, writing-quality Notion

social-media-coordinator x-style, linkedin-style, threads-style, bluesky-style, mastodon-style, writing-quality Typefully, Notion

seo seo-audit, site-architecture, schema, programmatic-seo Notion

email email-style, email-adaptation, deliverability, resend-build, writing-quality Resend, Notion

Two specialists carry an evidence boundary worth knowing about. seo has no crawler, rank tracker, or Search Console, and its audit checklist marks every check as verifiable by fetch or not verifiable at all. email cannot see inbox placement or domain reputation, and its deliverability checklist does the same. Both are built to say what they could not check rather than infer it. Local development Link the project you deployed, or a fresh one, and pull its environment: vercel link vercel env pull pnpm dev # then run /model once in the TUI to link a provider

Command Does

pnpm dev eve dev TUI

pnpm validate Lint, typecheck, and discovery diagnostics in one

pnpm check / pnpm fix Ultracite check and auto-fix

pnpm typecheck tsc --noEmit

npx eve info Print every discovered tool, skill, connection, and subagent

eve deploy Ship to production

There is no unit test suite. Verify with pnpm validate, which must report 0 errors and 0 warnings, then exercise the agent in the TUI. Approval gates render there too, so it is the place to confirm a send actually stops before it goes out. npx eve info is the fastest way to confirm a change landed. If a file you added does not appear, discovery did not classify it as an authored slot, and .eve/discovery/diagnostics.json says why.

Setting up the connectors by hand The Deploy button does this for you. For a project you did not create with the button, use the Vercel CLI:

Notion connector (prints the UID notion/marketing-team -> NOTION_CONNECTOR)

vercel connect create notion --name marketing-team

Resend connector (prints the UID resend/marketing-team -> RESEND_CONNECTOR)

vercel connect create resend --name marketing-team

Slack connector, then re-point its trigger at eve's Slack route

vercel connect create slack --name marketing-team --triggers vercel connect detach slack/marketing-team --yes vercel connect attach slack/marketing-team --triggers --trigger-path /eve/v1/slack --yes

Blob store

vercel blob create-store assets --access public --yes

Typefully API key, from your Typefully workspace settings

vercel env add TYPEFULLY_API_KEY Verify a sending domain in the Resend dashboard as well. Nothing can be sent without one.

Customizing Where to edit, at a glance. CUSTOMIZING.md is the walkthrough, with recipes for adding a specialist, skill, tool, or connection, and the silent failures worth knowing about. The agent auto-updates as you edit these files.

To change Edit Notes

Who is on the team Add a directory under agent/subagents/ The directory name is the tool name; the description in its agent.ts is all the lead sees when choosing

The lead's behavior agent/instructions.md Grounding, routing, brief writing, handing back

A specialist's craft Its instructions.md and skills/ A skill's frontmatter description decides when it loads

Voice and banned words references/banned-words.json in each <surface>-style skill Add a surface by adding the skill folder and passing its name in that agent's tools/lint_against_style.ts

Approval gates APPROVAL_REQUIRED_TOOLS in connections/notion.ts, DELETE_TOOLS / PUBLISH_TOOLS in typefully.ts, SEND_TOOLS / DESTRUCTIVE_TOOLS in resend.ts The Notion copies are identical, so change them together

What the email agent can reach ALLOWED_TOOLS in connections/resend.ts An allow list of 47 tools out of roughly 85. Prefer adding a name here over loosening a gate

Models agent/agent.ts and each agent/subagents/<id>/agent.ts Or run /model in the TUI. Every agent runs the same model; the lead routes rather than writes, so it is the first place to try a cheaper tier

Shared code agent/lib/<domain>/ eve scopes skills to one agent, so a shared procedure is either copied markdown or a defineSkill factory called from a one-line file per agent

Adding a remote specialist Specialists do not have to live in this repo. eve's remote agents let the lead delegate to an agent in its own deployment, with its own skills, connections, and release cycle. vercelOidc() handles deployment-to-deployment auth with no shared secret. // agent/subagents/paid_ads.ts import { defineRemoteAgent } from "eve"; import { vercelOidc } from "eve/agents/auth";

export default defineRemoteAgent({ url: () => process.env.PAID_ADS_AGENT_URL ?? "https://your-paid-ads-agent.vercel.app", description: "Plan and write paid search and social ads: audience, offer, and the copy variants to test. " + "Pass the campaign goal, the audience, the budget, and any brand constraints in the message.", auth: vercelOidc(), }); Set PAID_ADS_AGENT_URL, and the lead picks the specialist up from its description exactly as it does the local ones. The result comes back as a normal tool result. This suits work needing credentials or a release cycle you would rather keep out of this repo, such as ad platform access. Learn more

Link Covers

Run a marketing team from Slack with eve The guide to this template, end to end

eve documentation The framework powering this agent

eve subagents Delegation, fresh sessions, routing descriptions

eve skills Load-on-demand skills and reference files

Human in the loop The approval gates above

Vercel Connect Notion, Resend, and Slack credentials

Vercel Blob Brand context, preferences, artifacts, assets

Typefully API The social publishing queue

Resend MCP server The email tools the email specialist calls

Deeper internals live in ARCHITECTURE.md, and conventions for working in this repo live in AGENTS.md. Related templates

eve Sanity Copilot eve Content Agent eve Personal Agent

source

github.com · 4 images · 131 links

Comments (0)

No comments yet