# Ben McAdams — full content bundle

> Senior engineer at Zapier, building agents.

Everything on benmcadams.info in a single document. Individual pages remain available at their canonical URLs and via `.md` mirrors.

---

# Resume
URL: https://benmcadams.info/resume

# Ben McAdams

Senior engineer at Zapier, building agents.

## About

Full-stack engineer with 10+ years across product growth, developer experience, and platform infrastructure. Right now I'm Zapier's Tech DRI for Agent Discovery, spending most of my time figuring out how AI agents find, understand, and act on the web — MCP, llms.txt, JSON-LD, A2A. I like working across the whole stack: TypeScript and Next.js on top, Go, Node.js, and Kubernetes underneath.

## Experience

### Senior Software Engineer, Product Growth — Zapier
2024-11 → present

Driving growth through product engineering, developer experience, and AI discoverability. Focused on increasing Zapier's visibility to both humans and AI agents across the web. Tech DRI on cross-functional initiatives spanning experimentation, platform architecture, SEO, and agentic discovery.

- Tech DRI for Agent Discovery — set technical direction across schema markup, .md mirrors, llms.txt, and agent-facing skills on zapier.com's highest-traffic surfaces.
- Driving measurable impact on agent readiness — zapier.com's visibility to AI agents and answer engines has grown dramatically, week over week, since rolling out schema markup, markdown mirrors, and llms.txt.
- Built and manage memberhome, Zapier's Fastify GraphQL BFF, from the ground up — scaling it to meet surging traffic demand from both human visitors and the AI agents increasingly crawling and querying zapier.com.
- Built Zapier's open source presence — created zapier.com/opensource and the processes behind it, shipping Claude and Codex plugin manifests, llms.txt, and agent skills across zapier/sdk, zapier/zapier-mcp, and zapier/marketplace.

### Senior Software Engineer, Developer Experience — GoFundMe
2023-03 → 2024-10

Full stack engineer on the developer experience team.

- Introduced Kubernetes at Classy (acquired by GoFundMe) — stood up the first production clusters on AWS, deployed internal services via ArgoCD (GitOps), and established the container-first default for new services.
- Rolled out Backstage (open source IDP) as the internal developer portal — integrating service catalog, tech docs, and health signals into daily engineering workflow.

### Software Engineer II, Full Stack — Twitter
2022-07 → 2023-05

- Twitter 2.0 — lead engineer on Twitter Finance and Twitter Hashflags. Both shipped as advertisement products across iOS, Android, and web, generating revenue at launch.
- Cashtag Search — built the search-surface ad module for Twitter Finance: searching a cashtag like $TSLA triggered a live ticker-price ad inline with search results.
- Twitter 1.0 — delivered features and optimizations to the advertisement technology stack; worked directly with the largest advertisers to translate requirements into backend decisions.

### Software Engineer II, Backend — Twitter
2019-06 → 2022-07

Mobile developer productivity and CI/CD at Twitter scale.

- Designed and maintained CI/CD pipelines used daily by 400+ iOS and Android engineers across Twitter's mobile monorepos.
- Cut iOS CI build times from ~60 minutes to ~15 minutes — 4x faster feedback for every mobile engineer, every commit.
- Led migration of macOS developer productivity infrastructure and CI workloads from on-premise data centers to the cloud, unlocking elastic capacity and cutting queue times.
- Built cross-language tooling (Scala, Go, Python) across cloud platform services to raise mobile engineering velocity.

### Software Engineer, Full Stack — SAP
2018-09 → 2019-05

Built services in Go, React, and CockroachDB — deployed across AWS, GCP, and Azure — enabling SAP employees to migrate existing workloads and day-to-day tasks to the cloud.

### Software Engineer, Frontend — SAP
2015-10 → 2018-08

Designed and built transforms within SAP's cloud-based ETL tool Flowgraph using Node.js and HANA DB. Drove team test automation by standing up a scalable regression test suite.

### Software Development Intern — SAP
2013-08 → 2015-10

### IT Technician — University of Wisconsin — La Crosse
2012-08 → 2013-07

General IT help-desk support. Troubleshot and repaired student and faculty computers. Imaged and re-imaged campus desktops.

## Education

### University of Wisconsin — La Crosse
Bachelor's Degree, Mathematics and Computer Science
2011 → 2015

## Skills

- **Agent & AI Discovery** — Model Context Protocol (MCP), Agent-to-Agent (A2A), AAuth (Agent Auth), llms.txt, Agent Discovery, AI SEO / GEO, Structured Data (JSON-LD), Schema.org, Claude Agent SDK, Codex Plugins, Agent Skills, Tool-Use
- **Product & Growth Engineering** — Experimentation, A/B Testing, Feature Flags, Split.io / Harness, Eppo, Tech DRI, Cross-Functional Technical Leadership, SEO / GEO
- **Developer Experience** — Internal Developer Platforms, Backstage, SDK & CLI Design, Developer Onboarding, CI/CD, Developer Tooling
- **Platform Engineering** — Kubernetes, ArgoCD, GitOps, Cloud Infrastructure, Build Systems, Mobile CI at Scale
- **Languages & Frameworks** — TypeScript, Go, Node.js, React, Next.js, GraphQL, Fastify, Python
- **Cloud** — AWS, Google Cloud Platform, Azure

## Languages

- English (Native)

## Elsewhere

- [GitHub](https://github.com/BenMcGit)
- [LinkedIn](https://www.linkedin.com/in/benmcgit/)


---

# Projects
URL: https://benmcadams.info/projects

# Projects

Field Notes capture the journey — this is the destination.

## Agents

- **[benmcadams.info MCP server](https://benmcadams.info)** _(2026)_ — Personal MCP server exposing my resume, notes, and portfolio as callable tools. Dogfoods the same agent-discovery patterns I ship at work — MCP, JSON Resume, llms.txt, and Schema.org Person JSON-LD.
  Tags: `MCP`, `Personal Site`, `JSON Resume`, `llms.txt`
- **[Driver of the Zapier Marketplace](https://github.com/zapier/marketplace)** _(2026)_ — Conceived and built the Zapier Marketplace — a central distribution channel connecting Zapier's connectors, skills, and plugins to agent platforms like Claude, Codex, and GitHub Copilot in a single install.
  Tags: `Zapier Marketplace`, `Agent Plugins`, `Open Source`
- **Early adopter of WebMCP** _(2026)_ — One of the first teams evaluating WebMCP — the emerging proposal for exposing MCP-style tool discovery directly to browser-based agents — for Zapier's web surfaces.
  Tags: `WebMCP`, `MCP`, `Agent Discovery`
- **Endurix** _(2024)_ — A personal training AI agent for endurance athletes. No longer online, but building it was a great excuse to learn and explore how to build AI applications.
  Tags: `AI Agents`, `Endurance Sports`, `Personal Project`

## Developer Experience

- **Kubernetes + ArgoCD at Classy/GoFundMe** _(2023–2024)_ — Stood up Classy's first production Kubernetes clusters on AWS and deployed internal services via ArgoCD (GitOps). Established the container-first default for new services post-acquisition.
  Tags: `Kubernetes`, `ArgoCD`, `GitOps`, `AWS`
- **Backstage IDP at GoFundMe** _(2023–2024)_ — Rolled out Backstage as the internal developer portal — wiring service catalog, tech docs, and health signals into daily engineering workflow.
  Tags: `Backstage`, `Developer Portal`, `IDP`
- **Twitter Mobile CI at scale** _(2019–2022)_ — Designed and maintained CI/CD pipelines used daily by 400+ iOS and Android engineers. Cut iOS build times from ~60 minutes to ~15 minutes and led the migration of macOS developer productivity infra from on-premise to the cloud.
  Tags: `CI/CD`, `Mobile`, `macOS`, `Cloud Migration`
- **[Zapier SDK/CLI examples factory](https://github.com/zapier/sdk)** _(2026)_ — Contributor to the factory that auto-generates SDK examples and CLI command references for every Zapier-supported app and publishes them to zapier/sdk for agent discoverability.
  Tags: `Zapier SDK`, `Developer Experience`, `Agent Discovery`

## Product

- **Managed JSON-LD schema across Zapier's marketing pages** _(2026)_ — Replaced hardcoded SoftwareApplication JSON-LD with structured Service + OfferCatalog data covering triggers, actions, and integrations. Schema-rich pages won head-to-head in A/B testing against the prior markup.
  Tags: `JSON-LD`, `Schema.org`, `Agent Readiness`, `SEO`
- **.md mirrors on Zapier's highest-traffic pages** _(2026)_ — Shipped Markdown mirrors of every 1S and 2S integration page with Tier 3 llms.txt breadcrumb headers, giving AI crawlers clean, parsable content on the site's most valuable SEO surfaces.
  Tags: `Markdown Mirrors`, `llms.txt`, `Agent Readiness`, `SEO`
- **Twitter Finance + Hashflags** _(2022–2023)_ — Lead engineer on two revenue-generating advertisement products at Twitter, delivered end-to-end across iOS, Android, and web.
  Tags: `Ads`, `iOS`, `Android`, `Web`
- **[theraceradar.com](https://theraceradar.com)** _(ongoing)_ — Personal programmatic SEO site for endurance racing — thousands of running, cycling, swimming, and triathlon events across all 50 US states, organized by state, sport, and individual race. A pSEO template applied to a domain I love.
  Tags: `Programmatic SEO`, `Endurance Sports`, `Personal Project`


---

# Agent discovery
URL: https://benmcadams.info/agents

# Agent discovery

What an agent can do here, the protocols and tools behind it, and the research that shaped the decisions.

Live crawler and MCP tool activity: [/agents/live-stats](/agents/live-stats)

## Capabilities

- **Search my Field Notes** — Keyword search over every post, with snippets showing the match. (`search_notes`)
- **Answer questions about my projects** — Browse the agent, developer-experience, and product work in my portfolio. (`get_portfolio`)
- **Get my resume** — As structured JSON, plain markdown, or a link to the PDF download. (`get_resume`, `download_resume`)
- **List or fetch a specific post** — Metadata for every post, or the full raw markdown of one by slug. (`list_notes`, `get_post`)
- **Get a quick summary of this site** — Who I am and what tools are available, in one call. (`about`)

## Protocols

### llms.txt — Should implement

A short markdown index of the site written for language models. Points at every page and every machine-readable file. Now a de facto standard for LLM-readable site maps — cheap to publish, obvious upside.

[/llms.txt](/llms.txt) · [/llms-full.txt](/llms-full.txt) · [llmstxt.org](https://llmstxt.org)

### Markdown mirrors — Should implement

Every page has a plain-markdown twin. Append .md to any URL, or send Accept: text/markdown. Agents can consume the site without parsing HTML or running JavaScript. Trivial to add, big win.

[/resume.md](/resume.md) · [/sitemap.md](/sitemap.md) · [/AGENTS.md](/AGENTS.md)

### Model Context Protocol — Should implement

A Streamable HTTP MCP server exposing typed tools. Any MCP client (Claude Desktop, Cursor, VS Code) can connect and query the site as a live data source. The spec still moves, but the client ecosystem has already converged — shipping now is right.

[/api/mcp](/api/mcp) · [server card](/.well-known/mcp.json) · [modelcontextprotocol.io](https://modelcontextprotocol.io)

### agents.json — Too soon

Root manifest describing what an agent can do on the site — endpoints, tools, content-negotiation rules. Overlaps with the MCP server card. Spec is still emerging with no clear consensus. Publish it if it's cheap, but don't count on it yet.

[/agents.json](/agents.json) · [/AGENTS.md](/AGENTS.md)

### Schema.org JSON-LD — Should implement

Structured data embedded on every content page. Person on /resume with full work history, Blog + BlogPosting on notes, WebSite on the home page, CollectionPage on /projects. Not new, but table stakes for knowledge graphs, rich results, and any agent that reads structured data.

[/resume](/resume) · [ai-catalog.json](/.well-known/ai-catalog.json) · [schema.org](https://schema.org)

### Agent-to-Agent (A2A) — Too soon

A protocol for agents to discover and delegate tasks to other agents via an Agent Card. Interesting fit for a site whose whole premise is agent discovery, but the spec and client ecosystem are still early — watching, not building yet.

[a2a-protocol.org](https://a2a-protocol.org)

### OpenAPI — Not necessary

A REST API spec would give tool-callers a schema without MCP. This site's only real API surface is the MCP server itself, so a parallel OpenAPI description would duplicate it for no real gain right now.

## Tools

The MCP server at [/api/mcp](/api/mcp) exposes:

- `about()` — Quick summary of the site and available tools.
- `get_resume()` — Full JSON Resume of Ben McAdams.
- `download_resume()` — Get links to download Ben's resume as a PDF or markdown file.
- `list_notes()` — List blog posts (metadata only).
- `get_post()` — Get the full markdown of a post by slug.
- `search_notes()` — Keyword search over post bodies.
- `get_portfolio()` — Portfolio of agent, DX, and product work.
- `trivia()` — Play a short trivia game about Ben.

## Research

- [Two kinds of AI crawler](/notes/two-kinds-of-ai-crawler) — The split between training-style crawlers and user-side fetchers changes how I read a traffic spike.
- [Two agent auth specs, at once](/notes/two-agent-auth-specs) — Two proposals for agent auth landed the same week — same name, same problem, different mechanisms.
- [MCP is a toolbox. A2A is a coworker.](/notes/mcp-toolbox-a2a-coworker) — MCP and A2A get lumped together, but they solve different problems.
- [AI agents fetch pages differently](/notes/agents-fetch-differently) — A 308 redirect broke ChatGPT's retrieval but not Claude's. Same URL, different behavior.
- [Markdown mirrors](/notes/markdown-mirrors) — Serving .md alongside HTML is cheap, and it makes agents parse your pages far more efficiently.

## API

Every machine-readable file this site publishes.

- `/llms.txt` — Index for language models
- `/llms-full.txt` — Full content bundle (all pages + posts)
- `/AGENTS.md` — Agent-facing guide (endpoints, tools, mirrors)
- `/agents.json` — Root agent manifest
- `/robots.txt` — Crawler directives
- `/sitemap.xml` — Sitemap (XML)
- `/sitemap.md` — Sitemap (markdown)
- `/feed.xml` — RSS feed of notes
- `/.well-known/ai-catalog.json` — Agent capability catalog (ARD)
- `/.well-known/mcp.json` — MCP server card
- `/api/mcp` — MCP server (Streamable HTTP) — resume, notes, portfolio tools
- `/*.md` — Markdown mirror of any page (also via Accept: text/markdown)


---
# Note: A rival worth learning from
URL: https://benmcadams.info/notes/pogacar-compassionate-rival

---
title: "A rival worth learning from"
date: 2026-07-19
description: "Tadej Pogačar's interview after Jonas Vingegaard crashed out of the Tour de France stuck with me as a small model of leadership."
---

Watching the Tour de France today, Jonas Vingegaard crashed out on stage 15 with a broken collarbone. Tadej Pogačar — his biggest rival, arguably the best rider in the world — did the post-stage interview a few minutes later.

He didn't just say something polite and move on. He talked about how their rivalry became a real, respectful relationship over the years, and how the Tour "won't be the same" without him. It felt genuine, not like a media-trained line.

That stuck with me. Pogačar had every reason to just focus on his own race — he's still competing, still has a stage to think about. Instead he took the moment to be generous about the guy he's trying to beat.

I think that's what good leadership actually looks like. Not the big speeches, the small moments where you could take the easy path and don't. Every kid who loves cycling is watching how Pogačar acts, probably more than they're watching how he rides. He's setting a bar for how to compete hard and still be decent to the person across from you.

Filing this here so I remember it.


---
# Note: Two agent auth specs, at once
URL: https://benmcadams.info/notes/two-agent-auth-specs

---
title: "Two agent auth specs, at once"
date: 2026-07-14
description: "Two proposals for agent auth landed the same week — same name, same problem, different mechanisms."
---

Two "agent auth" proposals landed on my radar in the same week. Both use the name, both target the same problem, both come from credible camps.

- **[AAuth](https://www.aauth.dev/)** from Dick Hardt — one of [the authors of OAuth 2.0](https://datatracker.ietf.org/doc/html/rfc6749). Agents sign requests with a per-agent keypair instead of carrying bearer tokens. The framing is roughly: clients used to be written by hand, now agents assemble them at runtime, and the protocols underneath weren't built for that.
- **[Agent Auth Protocol](https://agentauthprotocol.com/)** from the Better Auth team. Per-agent identities with scoped capabilities baked in — one agent gets `read:accounts (last 90 days)`, another gets `transfer:funds (≤$500)`. Same underlying user, different tokens, different limits.

The starting observation is identical: OAuth today issues one shared bearer per app. The server can't tell one agent instance from another, and per-call policy is impossible when authorization was frozen at consent time.

The mechanisms diverge from there. AAuth leans on cryptographic identity plus signed requests. Agent Auth Protocol leans on per-agent capability tokens with a discovery layer — see [gmail.agent-auth.directory](https://gmail.agent-auth.directory/) for the shape.

The bit that stands out to me is the name collision. Two credible groups landed on "agent auth" and neither seems to be backing down. Whichever shape wins, the fact that OAuth's own editor is designing a successor is probably the signal worth watching.

Filing this here. Curious which one picks up adopters first.


---
# Note: MCP is a toolbox. A2A is a coworker.
URL: https://benmcadams.info/notes/mcp-toolbox-a2a-coworker

---
title: "MCP is a toolbox. A2A is a coworker."
date: 2026-07-14
description: "MCP and A2A get lumped together, but they solve different problems."
---

Something I've been chewing on: [MCP](https://modelcontextprotocol.io/specification) and A2A get lumped together, but they solve different problems.

MCP exposes tools, resources, and prompts to an AI client. It gives an agent capabilities like `search_notes`, `read_note`, or `create_note_pr`.

A2A is also a protocol, but designed for one agent to delegate work to another. Instead of calling a low-level tool, the caller asks a publishing agent to "turn this idea into a note and open a PR." The publishing agent owns the workflow and decides how to do it.

The mental model I keep landing on:

- **MCP is a toolbox.**
- **A2A is a coworker.**

They're complementary. An A2A agent can use MCP tools internally.

Example flow: ChatGPT → A2A publishing agent → MCP tools (GitHub, Vercel, and so on).

MCP is the plumbing. A2A is the collaboration layer.


---
# Note: AI agents fetch pages differently
URL: https://benmcadams.info/notes/agents-fetch-differently

---
title: "AI agents fetch pages differently"
date: 2026-07-14
description: "A 308 redirect broke ChatGPT's retrieval but not Claude's. Same URL, different behavior."
---

I assumed that if a page was public, allowed by `robots.txt`, and in the sitemap, any AI assistant would be able to read it.

That wasn't always true.

This site redirected `benmcadams.info` → `www.benmcadams.info` with a standard [308](https://datatracker.ietf.org/doc/html/rfc7538). Claude followed it and read the page fine. ChatGPT's retrieval tool couldn't get there.

Doesn't prove ChatGPT never follows redirects. It does show that retrieval systems can behave very differently on the same URL.

The takeaway I'm sitting with: point the URLs in your sitemap, canonical metadata, and internal links directly at a `200 OK`. Every hop is another chance for something to fail.

Fewer retrieval steps, fewer opportunities to fail.


---
# Note: Two kinds of AI crawler
URL: https://benmcadams.info/notes/two-kinds-of-ai-crawler

---
title: "Two kinds of AI crawler"
date: 2026-07-13
description: "The split between training-style crawlers and user-side fetchers changes how I read a traffic spike."
---

Something small worth writing down after a morning of staring at crawler traffic.

Most of the "AI bot traffic" numbers I've seen collapse everything into one bucket. The split I've found more useful:

- **Training-style crawlers** — `ClaudeBot`, `GPTBot`, `PerplexityBot`. Sweep pages in bulk. Return almost no referral traffic downstream.
- **User-side fetchers** — `Claude-User`, `ChatGPT-User`, `OAI-SearchBot`. Fire when a person asks their assistant about your site. Correlate with brand visibility inside AI answers.

OpenAI actually makes this distinction explicit in their [crawler overview](https://developers.openai.com/api/docs/bots) — GPTBot is for training, ChatGPT-User is user-initiated, OAI-SearchBot surfaces sites inside ChatGPT search. Same shape holds for Anthropic (ClaudeBot vs Claude-User).

Same origin, very different signal. When the training crawler jumps five-fold week-over-week but the user-side fetcher stays flat, that's vendor-initiated crawling — a re-crawl, an index refresh, expanded coverage. Not more people asking about you. Reading it as "we're getting popular in AI answers" would be wrong.

The other thing I've been watching: 404s to [`.well-known`](https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml) paths like `agent-card.json` and `openid-configuration`, and paths that look like [MCP](https://modelcontextprotocol.io/specification) endpoints. Agents are probing for surfaces that don't exist yet. Whether we should serve them is a separate question — but at least knowing they're being probed is useful.

Might be wrong. Curious how this evolves as answer engines mature.


---
# Note: Markdown mirrors
URL: https://benmcadams.info/notes/markdown-mirrors

---
title: "Markdown mirrors"
date: 2026-07-12
description: "Serving .md alongside HTML is cheap, and it makes agents parse your pages far more efficiently."
---

Every human page on this site has a `.md` mirror. Append `.md` to any URL — or send `Accept: text/markdown` — and you get clean markdown instead of the rendered HTML.

Why bother?

Agents parse markdown far more cheaply than HTML. No site chrome, no navigation, no scripts, no CSS — just content. That means fewer tokens per page, which means less of the agent's context budget spent on structure it's going to throw away anyway.

The convention isn't standardized yet, but a rough consensus is forming around two shapes:

- **Path suffix.** Serve `/foo` (HTML) and `/foo.md` (markdown) side by side. Cacheable, easy to link, easy to reason about. The [llms.txt](https://llmstxt.org) spec recommends this.
- **Content negotiation.** Same URL, but if the request sends `Accept: text/markdown`, return markdown. [Vercel wrote a good post on how to implement this in Next.js](https://vercel.com/blog/making-agent-friendly-pages-with-content-negotiation).

This site does both.

There are also scanners now — [isitagentready.com](https://isitagentready.com) is one — that grade your site on how discoverable and machine-readable it is. Markdown mirrors are one of the things they explicitly check for. Cheap thing to add. Worth doing.

More soon.


---
# Note: Hello, world
URL: https://benmcadams.info/notes/hello-world

---
title: "Hello, world"
date: 2026-07-10
description: "A small home for field notes on the things I'm learning."
---

I started this site because I keep learning small things — about work, about training, about building — and losing them in Slack threads and DMs. Field notes go here now.

Some threads I might pull on:

- **Agents and agent discovery.** Most sites are built for humans and search engines. Very few are optimized for the agents that will increasingly be the first (and sometimes only) reader.
- **Developer experience.** Especially on the shifting stack of agents, MCP, SDKs, and the tools around them.
- **Running, biking, and swimming.** Any of the three, when there's something worth noting.
- **Whatever else grabs me.** No strict scope — if it's worth writing down, it goes here.

Expect them short and unpolished. More the shape of a note than a blog post.

More soon.

