PageSourceSearch

https://www.patronage.com/assets/content-8c6jeM0G.js

js patronage.com collected 2026-10-10 00:04:49 UTC 88,402 bytes, 909 lines download raw bytes

1import{t as e}from"./flags-DzzekmRP.js";var t=[{title:`A Meta Creative Farm Built from Organic Content`,summary:`Steyer for Governor already had a strong TV-style creative track. Meta needed a different diet, so organic posts became a reviewable farm system for light spend, quick human confirmation, and promotion into the larger paid program.`,projectSlug:`steyer-for-governor`,offeringSlugs:[`campaign-automation`],date:`2026-07-09`,template:`loop-campaign`,client:`Steyer for Governor`,window:`May 29 - Jun 1, 2026`,surfaces:[`X`,`Facebook`,`Instagram`,`YouTube Shorts`],team:`One paid media team`,eyebrow:`Steyer for Governor - Meta creative farm`,heroLines:[{text:`Turn organic`},{text:`traction`,tone:`mark`},{text:`into paid`,tone:`clip`},{text:`signal.`,tone:`pink`}],loopTitle:`Find candidates. Test lightly. Promote what earns it.`,loopIntro:`Scan, stage, confirm, test, report, promote.`,loopShowHeader:!1,loopStops:[{label:`SCAN`,sub:`X, Facebook, Instagram, YouTube Shorts`,title:`Automated fetch`},{label:`SURFACE`,sub:`Vertical, direct-to-camera, positive sentiment`,title:`Plain-language criteria`},{label:`CATEGORIZE`,sub:`Easy to tune as the campaign learned`,title:`Editable rules`}
1,{label:`CONFIRM`,sub:`Light spend only after approval`,title:`Quick human review`},{label:`TEST`,sub:`ThruPlay and audience signal`,title:`Low-budget boost`},{label:`REPORT`,sub:`Promote, hold, and retire guidance`,title:`Weekly readout`},{label:`PROMOTE`,sub:`Winners graduate, weak items drop`,title:`Paid track`}],outcomes:[{body:`The Loop Agent looked across X, Facebook, Instagram, and YouTube Shorts so promising feed-native posts did not depend on someone remembering to check every surface manually.`,label:`Organic surfaces scanned`,unit:`feeds`,value:`4`},{body:`The system staged candidates and review artifacts. People still confirmed what deserved light spend and what could graduate into the larger paid track.`,label:`Spend decisions automated`,unit:`none`,value:`0`},{body:`Across the Meta video program, cost per ThruPlay fell over eight weeks while weekly spend scaled roughly 6x.`,label:`Cost per ThruPlay`,unit:`lower`,value:`57%`}],sections:[{type:`loop`,id:`loop`,showLabel:!1},{type:`mdx`,id:`story`,label:`The case study`,themeColor:`white`},{type:`outcomes`,id:`outcomes`,label:`What changed`,title:`The tedious work moved out of the way.`,body:`The Loop Agent did not replace media judgment. It made the judgment path faster and more legible: candidate discovery, eligibility checks, deduping, and review artifacts became repeatable, while spend decisions stayed with the campaign team.`,themeColor:`light`},{type:`cta`,id:`cta`,label:`Start a conversation`,title:`Bring us the creative workflow that keeps falling behind.`,body:`We will turn the recurring scan, review, and approval work into a system your team can trust before spend moves.`,ctaLabel:`Get in touch`,themeColor:`primary`}],content:`## Meta needed a different creative diet.
2
3The Steyer campaign already had the polished stuff: TV spots and YouTube pre-roll built to introduce a candidate at scale. That creative was doing its job.
4
5The problem was Meta, where the same footage read as an ad the moment it hit the feed. The channel did not need better production. It needed a different Tom: the one who shows up in organic clips, town halls, and off-script moments.
6
7So instead of cutting down TV assets, we built a system to find that material where it already existed. The campaign was already producing it organically. The hard part was keeping up: a growing stream of posts, a small window to act while a moment was still live, and no clean way to decide which pieces deserved spend before the conversation moved on.
8
9## Organic became the farm system.
10
11Promising posts get called up for light spend and a short look. Meta gets to learn on them. The ones that work get promoted into the larger paid program; the ones that do not get pulled before they eat more budget.
12
13That framing kept the important decision where it belonged. We were not trying to teach a machine to judge political creative. We were trying to make sure a human judgment happened fast enough, and on the right candidates, to matter.
14
15| Farm-system step | What changed | Why it mattered |
16| --- | --- | --- |
17| Find candidates | The Loop Agent scanned the campaign's organic surfaces for new posts | Promising feed-native ideas did not rely on manual feed watching |
18| Screen candidates | Channel rules, duplicate checks, and eligibility logic ran before review | The paid team saw a cleaner queue instead of another spreadsheet chore |
19| Confirm quickly | The team could stage candidates for light spend with quick human review to confirm | Spend decisions stayed human, but the decision arrived while the post was still timely |
20| Test audiences | The team compared wider Meta audiences with the same creative and equal spend | Budget decisions could account for audience efficiency, not just creative taste |
21| Promote or demote | Stronger items could move into the larger paid program; weak items could be pulled back | Meta kept getting variety without letting every test absorb budget |
22
23## The Loop Agent did the unglamorous work.
24
25Each Loop Agent run did the work that used to live in spreadsheets and someone's memory:
26
27- scans the campaign's organic surfaces - X, Facebook, Instagram, and YouTube Shorts - for new candidates
28- checks each one against what is already in the paid queue, so nothing gets staged twice
29- applies the campaign's own rules about which content types belong on which channels and what disqualifies a post
30- writes qualified posts into a review queue as rows a person can actually read and act on
31
32Eligibility stayed plain-language on purpose: vertical video, Tom speaking directly to camera, early organic traction, positive sentiment, and categories the team could edit as the campaign learned what deserved more oxygen.
33
34From there the pattern is simple and deliberate: stage candidates for light spend with quick human review to confirm, let Meta learn, then promote the winners and demote the weak items.
35
36The weekly report made that farm system useful. It ranked boosted posts, separated promote, hold, and retire signals, and gave the paid team a read on which organic ideas deserved more budget in the larger ThruPlays track.
37
38It also put targeting into the same loop. We could compare different wide Meta audiences against the same creative, watch cost per ThruPlay, reach, retention, and frequency, and use that evidence to shift budget toward the audiences giving the campaign more efficient video delivery.
39
40Normally, setting up true A/B tests across distinct audiences is time-consuming. With [patronage/agentic-marketing-connectors](https://github.com/patronage/agentic-marketing-connectors), orchestrating creative across audiences became a trivial implementation detail.
41
42## The spend decision stayed with the campaign.
43
44The Loop Agent curates. It does not move money on its own, and it does not change anything running in an ad account. Spend decisions stayed with the team.
45
46Every run leaves a record: what it scanned, what it skipped and why, and what advanced to the next step. That gave the campaign a paper trail for editorial and political control, and it let paid amplification track the pace of the content instead of the pace of a production calendar.
47
48## The point was not automation for its own sake.
49
50The win was giving the Meta program a reliable feed of native creative to test, without forcing feed-native ideas through a TV-shaped process that would have blunted them. The team could stay close to a fast-moving conversation, put small money behind the posts with a real shot, and let the results - not a guess - decide what earned more budget.
51
52Across the Meta video program, cost per ThruPlay fell 57% over eight weeks while weekly spend scaled roughly 6x. The point was a tighter loop between creative rotation, audience testing, and budget movement.
53
54That pattern is especially useful for advocacy and political campaigns, where relevance decays with the news cycle and message control still matters. Most teams already have a signal about what creative works; it is sitting in organic performance, unread by the paid team. If moving a post from organic to paid depends on someone happening to notice it, the answer arrives late or not at all. The Loop Agent made that handoff a system: scan, stage, confirm, test, report, promote. Humans kept the approval. The system kept watch.`,_meta:{filePath:`steyer-boost-tracker.mdx`,fileName:`steyer-boost-tracker.mdx`,directory:`.`,extension:`mdx`,path:`steyer-boost-tracker`},mdxSource:`## Meta needed a different creative diet.
55
56The Steyer campaign already had the polished stuff: TV spots and YouTube pre-roll built to introduce a candidate at scale. That creative was doing its job.
57
58The problem was Meta, where the same footage read as an ad the moment it hit the feed. The channel did not need better production. It needed a different Tom: the one who shows up in organic clips, town halls, and off-script moments.
59
60So instead of cutting down TV assets, we built a system to find that material where it already existed. The campaign was already producing it organically. The hard part was keeping up: a growing stream of posts, a small window to act while a moment was still live, and no clean way to decide which pieces deserved spend before the conversation moved on.
61
62## Organic became the farm system.
63
64Promising posts get called up for light spend and a short look. Meta gets to learn on them. The ones that work get promoted into the larger paid program; the ones that do not get pulled before they eat more budget.
65
66That framing kept the important decision where it belonged. We were not trying to teach a machine to judge political creative. We were trying to make sure a human judgment happened fast enough, and on the right candidates, to matter.
67
68| Farm-system step | What changed | Why it mattered |
69| --- | --- | --- |
70| Find candidates | The Loop Agent scanned the campaign's organic surfaces for new posts | Promising feed-native ideas did not rely on manual feed watching |
71| Screen candidates | Channel rules, duplicate checks, and eligibility logic ran before review | The paid team saw a cleaner queue instead of another spreadsheet chore |
72| Confirm quickly | The team could stage candidates for light spend with quick human review to confirm | Spend decisions stayed human, but the decision arrived while the post was still timely |
73| Test audiences | The team compared wider Meta audiences with the same creative and equal spend | Budget decisions could account for audience efficiency, not just creative taste |
74| Promote or demote | Stronger items could move into the larger paid program; weak items could be pulled back | Meta kept getting variety without letting every test absorb budget |
75
76## The Loop Agent did the unglamorous work.
77
78Each Loop Agent run did the work that used to live in spreadsheets and someone's memory:
79
80- scans the campaign's organic surfaces - X, Facebook, Instagram, and YouTube Shorts - for new candidates
81- checks each one against what is already in the paid queue, so nothing gets staged twice
82- applies the campaign's own rules about which content types belong on which channels and what disqualifies a post
83- writes qualified posts into a review queue as rows a person can actually read and act on
84
85Eligibility stayed plain-language on purpose: vertical video, Tom speaking directly to camera, early organic traction, positive sentiment, and categories the team could edit as the campaign learned what deserved more oxygen.
86
87From there the pattern is simple and deliberate: stage candidates for light spend with quick human review to confirm, let Meta learn, then promote the winners and demote the weak items.
88
89The weekly report made that farm system useful. It ranked boosted posts, separated promote, hold, and retire signals, and gave the paid team a read on which organic ideas deserved more budget in the larger ThruPlays track.
90
91It also put targeting into the same loop. We could compare different wide Meta audiences against the same creative, watch cost per ThruPlay, reach, retention, and frequency, and use that evidence to shift budget toward the audiences giving the campaign more efficient video delivery.
92
93Normally, setting up true A/B tests across distinct audiences is time-consuming. With [patronage/agentic-marketing-connectors](https://github.com/patronage/agentic-marketing-connectors), orchestrating creative across audiences became a trivial implementation detail.
94
95## The spend decision stayed with the campaign.
96
97The Loop Agent curates. It does not move money on its own, and it does not change anything running in an ad account. Spend decisions stayed with the team.
98
99Every run leaves a record: what it scanned, what it skipped and why, and what advanced to the next step. That gave the campaign a paper trail for editorial and political control, and it let paid amplification track the pace of the content instead of the pace of a production calendar.
100
101## The point was not automation for its own sake.
102
103The win was giving the Meta program a reliable feed of native creative to test, without forcing feed-native ideas through a TV-shaped process that would have blunted them. The team could stay close to a fast-moving conversation, put small money behind the posts with a real shot, and let the results - not a guess - decide what earned more budget.
104
105Across the Meta video program, cost per ThruPlay fell 57% over eight weeks while weekly spend scaled roughly 6x. The point was a tighter loop between creative rotation, audience testing, and budget movement.
106
107That pattern is especially useful for advocacy and political campaigns, where relevance decays with the news cycle and message control still matters. Most teams already have a signal about what creative works; it is sitting in organic performance, unread by the paid team. If moving a post from organic to paid depends on someone happening to notice it, the answer arrives late or not at all. The Loop Agent made that handoff a system: scan, stage, confirm, test, report, promote. Humans kept the approval. The system kept watch.`,slug:`steyer-boost-tracker`},{title:`Ten Designed Issue Pages, Each Backed by Search`,summary:`Campaign issue pages usually arrive too late to shape the conversation. Approved policy copy became 
107CMS pages with video, intent-mapped sections, and paid search campaigns that bought informational demand while organic rankings caught up.`,projectSlug:`steyer-for-governor`,offeringSlugs:[`web-development`,`seo-and-adwords`,`campaign-automation`],date:`2026-07-09`,template:`loop-campaign`,client:`Steyer for Governor`,window:`Mar - Jun 2026`,surfaces:[`Campaign website`,`Paid search`],team:`One campaign team`,eyebrow:`Steyer for Governor - Issue pages`,heroLines:[{text:`Ten issue`},{text:`pages,`,tone:`mark`},{text:`live fast,`,tone:`clip`},{text:`backed by search.`,tone:`pink`}],proofStats:[{label:`Issue pages shipped`,unit:`designed`,value:`10`},{label:`First page, brief to live`,unit:`day`,value:`1`}],loopTitle:`Designed pages. Search campaigns behind them.`,loopIntro:`Approved policy language became pages voters could scan and campaigns that could respond to the queries voters used.`,loopStops:[{label:`SOURCE`,sub:`One sheet, a tab per issue`,title:`Approved policy copy`},{label:`DESIGN`,sub:`Hero, issue sections, video, CTAs`,title:`Page structure`},{label:`CONNECT`,sub:`Sections mapped to voter questions`,title:`Search intent`},{label:`LAUNCH`,sub:`Ad groups deep-linked by issue focus`,title:`Paid search`},{label:`VET`,sub:`88 lines traced to source language`,title:`Approved ad copy`},{label:`FILTER`,sub:`Waste cut before spend scaled`,title:`Negative keywords`},{label:`LEARN`,sub:`Search terms guide the next pass`,title:`Query behavior`}],outcomes:[{body:`Housing, taxes, entertainment, electricity, gas prices, education, immigration, climate, healthcare, and AI policy each had a page built for voters to read, watch, and search.`,label:`Issue pages shipped`,unit:`designed`,value:`10`},{body:`Across the ten issue briefs, search was organized into 40 ad groups so ads, keywords, and landing-page sections could stay aligned by voter intent.`,label:`Issue ad groups mapped`,unit:`search`,value:`40`},{body:`Across the ten issue campaign briefs, search was mapped with 535 negative-keyword entries. The optimization review also marked 18 low-performing ad groups to pause, turning search-term review into a repeatable cleanup path.`,label:`Search cleanup filters`,unit:`negative`,value:`535`}],creativeAssets:[{height:941,kind:`image`,label:`The healthcare issue page using the shared issue-page system`,src:`/q/media/assets/steyer-issue-pages--healthcare`,width:1440},{height:941,kind:`image`,label:`The climate issue page using the shared issue-page system`,src:`/q/media/assets/steyer-issue-pages--climate`,width:1440}],sections:[{type:`loop`,id:`loop`,themeColor:`slate`},{type:`mdx`,id:`story`,label:`The case study`,themeColor:`white`},{type:`outcomes`,id:`outcomes`,label:`By the numbers`,title:`Search learned, then scaled.`,body:`The first week answered the basic question: would voters who came from search stay with the issue page? They did. Week two turned that behavior into an optimization target. After that, the work was scale: more issue pages, tighter negative keywords, and a steady weekly average at a much lower cost per engaged visit.`,table:{caption:`Issue-search engagement and efficiency`,columns:[`Phase`,`Window`,`Engaged visits`,`Engagement efficiency`,`What it proved`],rows:[[`Week 1 - initial learning`,`Mar 25-31`,`1,163`,`Baseline`,`The designed housing page could turn paid search clicks into engaged visits.`],[`Week 2 - scaling with optimization`,`Mar 31-Apr 7`,`2,794`,`+66% vs baseline`,`Once user_engagement became the optimization target, volume more than doubled while efficiency improved.`],[`Weeks 3-9 - scaled issue pages and optimization`,`Apr 7-Jun 2`,`4,900 avg / week`,`+245% vs baseline`,`Housing found its efficie
107nt baseline, then the five-issue platform held it through search-term and negative-keyword optimization.`]]},themeColor:`light`},{type:`cta`,id:`cta`,label:`Start a conversation`,title:`Turn a launch into a page and channel plan.`,body:`Bring us the issue, offer, or campaign you need in market. We will map the page, channel, and measurement path in one working session.`,ctaLabel:`Get in touch`,themeColor:`primary`}],content:`## Issue pages need speed and substance.
108
109A statewide campaign runs on issues - housing, gas prices, healthcare, education, climate, and whatever the news cycle adds next week. Each one needs its own page, but a page that is actually designed takes days: structure, visuals, resources, review, CMS work, QA. Under that pressure, most campaigns ship the simple version - approved policy text pasted into a CMS. The page exists, but it is not designed around what voters search for, watch, scan, or share.
110
111## Designed pages, not policy dumps.
112
113The housing page went from scoped brief to a live, CMS-backed page in a day. Speed mattered, but the bigger shift was the quality of the output: approved policy text became a designed page with a hero, issue-focus sections, a video carousel, and inline calls to action instead of one undifferentiated column. A script pulled related YouTube videos for each issue so the page had motion and context, turning a static policy statement into something a voter could watch, scan, and follow.
114
115![The housing issue page - designed, CMS-backed, and live in a day](/q/media/assets/steyer-issue-pages--housing-hero "1600x1000")
116
117## Built around how voters search.
118
119The issue-focus sections were not just layout - each one answered a specific search intent. The renters focus is the cleanest example: voters were not searching for "housing policy architecture." They were searching for rent control, tenant rights, eviction rules, rent increases, and renter protection. The paid campaign grouped those questions together and sent them to \`?focus=renters\`, where the page opened on the relevant policy highlight instead of asking the voter to hunt for it.
120
121| Renters query group | Example keywords | Est. monthly volume | Landing focus |
122| --- | --- | --- | --- |
123| Rent control | \`california rent control\` | 1,400 | \`?focus=renters\` |
124| Tenant rights | \`california tenant rights\`, \`california renters rights\` | 1,900 | \`?focus=renters\` |
125| Eviction and rent increases | \`california eviction laws\`, \`california rent increase\` | 750 | \`?focus=renters\` |
126| High-intent long tail | \`renters tax credit california\`, \`california tenant protection act\`, \`just cause eviction california\` | Low volume, high intent | \`?focus=renters\` |
127
128In month one, the Renter Protection ad group produced 20,543 impressions, 887 clicks, and 561 engagement conversions. Renters' search behavior showed exactly where copy needed to get more practical and less legalistic.
129
130![A housing deep link lands voters on the renter-protection section](/q/media/assets/steyer-issue-pages--focus-renters "1440x941")
131
132## Detailed search campaigns, built from approved language.
133
134The \`vet-copy\` step traced every headline and description back to the page - 88 lines, zero unapproved - so a deeply segmented search campaign came together from pre-approved text with minimal new review, not a fresh legal pass on every line. Ninety-nine negative keywords (58 campaign-level, 41 per ad group) filtered navigational and bargain-hunting queries before they spent a dollar.
135
136There was no time to earn organic rankings, so the campaign bought the intent instead - informational queries like "why are gas prices so high in California," cheap because few advertisers compete for them and dense with exactly the voters an issue page exists to inform. The bar was not the cheapest click; it was an engaged visit - ten seconds or more reading the policy. As search terms came in, the campaign had a reviewable path for tightening negatives, deep links, and copy around what voters were asking.
137
138| Search campaign layer | What it did | Why it mattered |
139| --- | --- | --- |
140| Approved-language source | 88 headlines and descriptions traced back to page copy | Fast launch without message drift |
141| Intent-mapped ad groups | Each housing theme matched a page section and \`?focus=\` deep link | Voters landed on the answer the ad promised |
142| Negative keyword system | 58 campaign-level and 41 ad-group negatives filtered waste | Spend went toward informational demand, not bargain or navigational searches |
143| Engagement bar | Optimization looked for visits with 10+ seconds reading policy | The campaign learned from actual issue interest, not click volume alone |
144
145## Fast pages only matter if they can learn.
146
147Ten pages shipped, each with enough design, structure, and channel connection to do useful work in market: answer a voter question, carry a video, land a search ad, and feed the next optimization pass. That is the difference between a campaign ready to shape the conversation and one still waiting on the build.`,_meta:{filePath:`steyer-issue-pages.mdx`,fileName:`steyer-issue-pages.mdx`,directory:`.`,extension:`mdx`,path:`steyer-issue-pages`},mdxSource:`## Issue pages need speed and substance.
148
149A statewide campaign runs on issues - housing, gas prices, healthcare, education, climate, and whatever the news cycle adds next week. Each one needs its own page, but a page that is actually designed takes days: structure, visuals, resources, review, CMS work, QA. Under that pressure, most campaigns ship the simple version - approved policy text pasted into a CMS. The page exists, but it is not designed around what voters search for, watch, scan, or share.
150
151## Designed pages, not policy dumps.
152
153The housing page went from scoped brief to a live, CMS-backed page in a day. Speed mattered, but the bigger shift was the quality of the output: approved policy text became a designed page with a hero, issue-focus sections, a video carousel, and inline calls to action instead of one undifferentiated column. A script pulled related YouTube videos for each issue so the page had motion and context, turning a static policy statement into something a voter could watch, scan, and follow.
154
155![The housing issue page - designed, CMS-backed, and live in a day](/q/media/assets/steyer-issue-pages--housing-hero "1600x1000")
156
157## Built around how voters search.
158
159The issue-focus sections were not just layout - each one answered a specific search intent. The renters focus is the cleanest example: voters were not searching for "housing policy architecture." They were searching for rent control, tenant rights, eviction rules, rent increases, and renter protection. The paid campaign grouped those questions together and sent them to \`?focus=renters\`, where the page opened on the relevant policy highlight instead of asking the voter to hunt for it.
160
161| Renters query group | Example keywords | Est. monthly volume | Landing focus |
162| --- | --- | --- | --- |
163| Rent control | \`california rent control\` | 1,400 | \`?focus=renters\` |
164| Tenant rights | \`california tenant rights\`, \`california renters rights\` | 1,900 | \`?focus=renters\` |
165| Eviction and rent increases | \`california eviction laws\`, \`california rent increase\` | 750 | \`?focus=renters\` |
166| High-intent long tail | \`renters tax credit california\`, \`california tenant protection act\`, \`just cause eviction california\` | Low volume, high intent | \`?focus=renters\` |
167
168In month one, the Renter Protection ad group produced 20,543 impressions, 887 clicks, and 561 engagement conversions. Renters' search behavior showed exactly where copy needed to get more practical and less legalistic.
169
170![A housing deep link lands voters on the renter-protection section](/q/media/assets/steyer-issue-pages--focus-renters "1440x941")
171
172## Detailed search campaigns, built from approved language.
173
174The \`vet-copy\` step traced every headline and description back to the page - 88 lines, zero unapproved - so a deeply segmented search campaign came together from pre-approved text with minimal new review, not a fresh legal pass on every line. Ninety-nine negative keywords (58 campaign-level, 41 per ad group) filtered navigational and bargain-hunting queries before they spent a dollar.
175
176There was no time to earn organic rankings, so the campaign bought the intent instead - informational queries like "why are gas prices so high in California," cheap because few advertisers compete for them and dense with exactly the voters an issue page exists to inform. The bar was not the cheapest click; it was an engaged visit - ten seconds or more reading the policy. As search terms came in, the campaign had a reviewable path for tightening negatives, deep links, and copy around what voters were asking.
177
178| Search campaign layer | What it did | Why it mattered |
179| --- | --- | --- |
180| Approved-language source | 88 headlines and descriptions traced back to page copy | Fast launch without message drift |
181| Intent-mapped ad groups | Each housing theme matched a page section and \`?focus=\` deep link | Voters landed on the answer the ad promised |
182| Negative keyword system | 58 campaign-level and 41 ad-group negatives filtered waste | Spend went toward informational demand, not bargain or navigational searches |
183| Engagement bar | Optimization looked for visits with 10+ seconds reading policy | The campaign learned from actual issue interest, not click volume alone |
184
185## Fast pages only matter if they can learn.
186
187Ten pages shipped, each with enough design, structure, and channel connection to do useful work in market: answer a voter question, carry a video, land a search ad, and feed the next optimization pass. That is the difference between a campaign ready to shape the conversation and one still waiting on the build.`,slug:`steyer-issue-pages`}],n=[{name:`Steyer for Governor`,logo:`/q/media/assets/steyer-for-governor--logo`,industry:`Statewide political campaign`,summary:`A statewide campaign built around connected systems for speed and execution: creative production, paid media controls, volunteer operations, sentiment insight, and election operations tooling.`,content:`Connected campaign infrastructure across creative, web, paid media, volunteer systems, and election operations.
188
189- [Issue Pages & Search Demand](/case-studies/steyer-issue-pages)
190- [Organic-to-Paid Creative Loop](/case-studies/steyer-boost-tracker)`,_meta:{filePath:`steyer-for-governor.mdx`,fileName:`steyer-for-governor.mdx`,directory:`.`,extension:`mdx`,path:`steyer-for-governor`},mdxSource:`Connected campaign infrastructure across creative, web, paid media, volunteer systems, and election operations.
191
192- [Issue Pages & Search Demand](/case-studies/steyer-issue-pages)
193- [Organic-to-Paid Creative Loop](/case-studies/steyer-boost-tracker)`,slug:`steyer-for-governor`}],r=[{name:`Campaign Automation`,summary:`Full-funnel campaign operations — research, generate, launch, measure, adapt — built as a system your team can see and steer.`,icon:`workflow`,content:`When California gas prices spiked, we turned one Monday brief into a 30-city campaign — per-city display creative, localized video, search flights, and a survey landing page — live by Thursday, optimizing by Saturday. Not because anyone worked the weekend, but because the campaign ran as a system instead of a relay race.
194
195That is what campaign automation means here. Not "AI runs your marketing." A working operating model — research, generate, launch, measure, adapt — where the handoffs that normally eat weeks collapse into one loop your team can watch run.
196
197## What the system does
198
199- **Creative at the scale the data deserves.** When the right move is 90 localized display units and 30 video variants from one data layer, that's a build job, not a quarter of agency hours.
200- **Cross-channel coordination.** Display, Meta, search, and landing pages launch from one brief and report into one measurement story — no reconciling three vendors' decks.
201- **Organic-to-paid pipelines.** Winning organic posts surface automatically and route into a paid review queue, so boosting decisions happen while the post is still alive.
202- **Results that trigger the next move.** Spend reallocation, copy refreshes, and creative re-cuts run on real response data, on a daily or weekly cadence.
203
204## Your team holds the controls
205
206Every automated step produces a reviewable artifact — a report, a queue, a proposed change — before money moves or creative ships. Approvals are part of the system, not an exception to it. We build the machine, document the operating recipes, and leave the controls with your team.
207
208## Where this fits
209
210This is the operating layer the other offerings plug into: [sites](/offerings/web-development) become the landing surface, [search programs](/offerings/seo-and-adwords) share the measurement spine. Read the [gas prices case study](/case-studies/steyer-gas-prices) to see a full cycle run in six working days.`,_meta:{filePath:`campaign-automation.mdx`,fileName:`campaign-automation.mdx`,directory:`.`,extension:`mdx`,path:`campaign-automation`},mdxSource:`When California gas prices spiked, we turned one Monday brief into a 30-city campaign — per
210-city display creative, localized video, search flights, and a survey landing page — live by Thursday, optimizing by Saturday. Not because anyone worked the weekend, but because the campaign ran as a system instead of a relay race.
211
212That is what campaign automation means here. Not "AI runs your marketing." A working operating model — research, generate, launch, measure, adapt — where the handoffs that normally eat weeks collapse into one loop your team can watch run.
213
214## What the system does
215
216- **Creative at the scale the data deserves.** When the right move is 90 localized display units and 30 video variants from one data layer, that's a build job, not a quarter of agency hours.
217- **Cross-channel coordination.** Display, Meta, search, and landing pages launch from one brief and report into one measurement story — no reconciling three vendors' decks.
218- **Organic-to-paid pipelines.** Winning organic posts surface automatically and route into a paid review queue, so boosting decisions happen while the post is still alive.
219- **Results that trigger the next move.** Spend reallocation, copy refreshes, and creative re-cuts run on real response data, on a daily or weekly cadence.
220
221## Your team holds the controls
222
223Every automated step produces a reviewable artifact — a report, a queue, a proposed change — before money moves or creative ships. Approvals are part of the system, not an exception to it. We build the machine, document the operating recipes, and leave the controls with your team.
224
225## Where this fits
226
227This is the operating layer the other offerings plug into: [sites](/offerings/web-development) become the landing surface, [search programs](/offerings/seo-and-adwords) share the measurement spine. Read the [gas prices case study](/case-studies/steyer-gas-prices) to see a full cycle run in six working days.`,slug:`campaign-automation`},{name:`SEO and AdWords`,summary:`Organic and paid search on one cadence — research, content, technical foundations, and measurement that connects rankings and spend to outcomes.`,icon:`search`,content:`Most SEO engagements are sold as deliverables: an audit, a keyword list, a quota of posts per month. The deliverables arrive on schedule; the results don't — because nobody tied the work to the queries people type, or to what those people do after the click.
228
229Our search work is easier to describe and harder to fake. Find the questions worth answering. Build pages that genuinely answer them. Keep the technical foundations boring. Measure whether search produced outcomes, not just traffic. Then do it again next week with better information.
230
231## What the work is
232
233- **Research that starts from queries, not categories.** Search Console data, SERP analysis, and competitor coverage produce a map of the questions your audience asks — informational queries included, because that's where underserved demand usually lives. That map, not a keyword-tool export, drives every brief.
234- **Content built to answer, not to fill a calendar.** Briefs answer the query fully, pages are structured around search intent, and internal linking lets authority compound instead of scattering across posts. AI drafts where it helps; editors decide what ships.
235- **Technical and on-page foundations, kept boring.** Indexation, site structure, page speed, titles and descriptions — the unglamorous work that decides whether good content gets seen at all. We fix it once and keep it fixed, instead of rediscovering it in every quarterly audit.
236- **Measurement that connects search to outcomes.** Rankings and traffic are leading indicators, not results. Every engagement defines the action a visitor should take — a call, a signup, a donation — and reports what search contributed to it, so the next round of work follows evidence.
237
238## One discipline, organic and paid
239
240Both run on one query map, one measurement spine, and one weekly cadence of reading results and adjusting. The content inventory that makes organic growth possible is the same inventory a paid program lands traffic on, and the same conversion measurement tells both sides what's working.
241
242Nowhere is that clearer than with the Google Ad Grant. A Grant lives or dies on exactly what a search program builds — indexable mission content, informational query coverage, and conversion tracking Google can trust. Good SEO is good Grant SEO, which is why our [Grant work](/google-ad-grants) audits the same foundations this program maintains. If you're a nonprofit weighing the Grant, that's the narrower version of this conversation.
243
244## What it looks like in market
245
246For Steyer for Governor, approved policy copy became ten designed issue pages whose sections mapped to the questions voters were typing — rent c
246ontrol, tenant rights, eviction rules — with paid search buying cheap informational demand while organic rankings caught up. The renter-protection ad group alone turned 20,543 first-month impressions into 561 engaged visits, and the search terms coming in showed exactly where the copy needed to get more practical and less legalistic. [Read the case study](/case-studies/steyer-issue-pages).
247
248## Where this fits
249
250Search compounds fastest when the landing surface can keep up. We often pair this program with [web development](/offerings/web-development) so the pages winning impressions can be reshaped as quickly as the queries shift — and with [campaign automation](/offerings/campaign-automation) when search is one channel in a larger system.`,_meta:{filePath:`seo-and-adwords.mdx`,fileName:`seo-and-adwords.mdx`,directory:`.`,extension:`mdx`,path:`seo-and-adwords`},mdxSource:`Most SEO engagements are sold as deliverables: an audit, a keyword list, a quota of posts per month. The deliverables arrive on schedule; the results don't — because nobody tied the work to the queries people type, or to what those people do after the click.
251
252Our search work is easier to describe and harder to fake. Find the questions worth answering. Build pages that genuinely answer them. Keep the technical foundations boring. Measure whether search produced outcomes, not just traffic. Then do it again next week with better information.
253
254## What the work is
255
256- **Research that starts from queries, not categories.** Search Console data, SERP analysis, and competitor coverage produce a map of the questions your audience asks — informational queries included, because that's where underserved demand usually lives. That map, not a keyword-tool export, drives every brief.
257- **Content built to answer, not to fill a calendar.** Briefs answer the query fully, pages are structured around search intent, and internal linking lets authority compound instead of scattering across posts. AI drafts where it helps; editors decide what ships.
258- **Technical and on-page foundations, kept boring.** Indexation, site structure, page speed, titles and descriptions — the unglamorous work that decides whether good content gets seen at all. We fix it once and keep it fixed, instead of rediscovering it in every quarterly audit.
259- **Measurement that connects search to outcomes.** Rankings and traffic are leading indicators, not results. Every engagement defines the action a visitor should take — a call, a signup, a donation — and reports what search contributed to it, so the next round of work follows evidence.
260
261## One discipline, organic and paid
262
263Both run on one query map, one measurement spine, and one weekly cadence of reading results and adjusting. The content inventory that makes organic growth possible is the same inventory a paid program lands traffic on, and the same conversion measurement tells both sides what's working.
264
265Nowhere is that clearer than with the Google Ad Grant. A Grant lives or dies on exactly what a search program builds — indexable mission content, informational query coverage, and conversion tracking Google can trust. Good SEO is good Grant SEO, which is why our [Grant work](/google-ad-grants) audits the same foundations this program maintains. If you're a nonprofit weighing the Grant, that's the narrower version of this conversation.
266
267## What it looks like in market
268
269For Steyer for Governor, approved policy copy became ten designed issue pages whose sections mapped to the questions voters were typing — rent control, tenant rights, eviction rules — with paid search buying cheap informational demand while organic rankings caught up. The renter-protection ad group alone turned 20,543 first-month impressions into 561 engaged visits, and the search terms coming in showed exactly where the copy needed to get more practical and less legalistic. [Read the case study](/case-studies/steyer-issue-pages).
270
271## Where this fits
272
273Search compounds fastest when the landing surface can keep up. We often pair this program with [web development](/offerings/web-development) so the pages winning impressions can be reshaped as quickly as the queries shift — and with [campaign automation](/offerings/campaign-automation) when search is one channel in a larger system.`,slug:`seo-and-adwords`},{name:`Web Development`,summary:`Fast, instrumented marketing sites that turn traffic into decisions. Shipped in days, built to keep learning after launch.`,icon:`globe`,content:`Most marketing sites are built as deliverables. A team ships the redesign, everyone celebrates, and the site never changes again — because every edit goes back through a ticket queue, and nobody can say which pages actually move the numbers.
274
275We build sites as the working surface of your marketing system. Every page ships with measurement wired 
275in from the first deploy, so the question "is this page doing its job" has an answer you can read, not a meeting you have to schedule.
276
277## What we build
278
279- **Marketing sites and landing pages** that go from brief to live in days. When a campaign needs thirty localized variants by Thursday, the build system is the reason that's a normal request instead of a heroic one.
280- **Instrumentation as a default, not a phase two.** Analytics events, conversion tracking, and reporting are part of the definition of done. You see real numbers from the first visitor.
281- **Pages that feed the loop.** Scroll depth, dwell, and conversion data flow back into campaign decisions — which headline to keep, which offer to re-cut, where to shift spend.
282
283## How we work
284
285We work in your repo with reviewable pull requests, not in a black box. Launches are small and frequent. The site stays fast because the stack is modern — React, TanStack, and edge deployment on Cloudflare — but the stack is the proof, not the point. The point is that your site can change as fast as your campaigns do.
286
287## Where this fits
288
289Web development is rarely the whole engagement. The sites we build are usually the landing layer for a [campaign system](/offerings/campaign-automation) or the publishing surface for an [SEO program](/offerings/seo-and-adwords) — one system, with the site as the place results show up first.`,_meta:{filePath:`web-development.mdx`,fileName:`web-development.mdx`,directory:`.`,extension:`mdx`,path:`web-development`},mdxSource:`Most marketing sites are built as deliverables. A team ships the redesign, everyone celebrates, and the site never changes again — because every edit goes back through a ticket queue, and nobody can say which pages actually move the numbers.
290
291We build sites as the working surface of your marketing system. Every page ships with measurement wired in from the first deploy, so the question "is this page doing its job" has an answer you can read, not a meeting you have to schedule.
292
293## What we build
294
295- **Marketing sites and landing pages** that go from brief to live in days. When a campaign needs thirty localized variants by Thursday, the build system is the reason that's a normal request instead of a heroic one.
296- **Instrumentation as a default, not a phase two.** Analytics events, conversion tracking, and reporting are part of the definition of done. You see real numbers from the first visitor.
297- **Pages that feed the loop.** Scroll depth, dwell, and conversion data flow back into campaign decisions — which headline to keep, which offer to re-cut, where to shift spend.
298
299## How we work
300
301We work in your repo with reviewable pull requests, not in a black box. Launches are small and frequent. The site stays fast because the stack is modern — React, TanStack, and edge deployment on Cloudflare — but the stack is the proof, not the point. The point is that your site can change as fast as your campaigns do.
302
303## Where this fits
304
305Web development is rarely the whole engagement. The sites we build are usually the landing layer for a [campaign system](/offerings/campaign-automation) or the publishing surface for an [SEO program](/offerings/seo-and-adwords) — one system, with the site as the place results show up first.`,slug:`web-development`}],i=[{title:`The Hard Part of a WordPress MCP Server Is Not WordPress`,summary:`WordPress can expose AI tools. The real work is designing the identity, policy, plugin, and provider boundary that makes those tools safe enough to use.`,date:`2026-07-28`,author:`Cameron Corda`,offeringSlugs:[`web-development`],template:`field-guide`,cta:{eyebrow:`Next step`,heading:`Planning a WordPress MCP server?`,body:`We build the first production setup as a fixed $10,000 engagement: identity, policy, plugin fields, logs, and a handoff your team can run.`,buttonLabel:`See the engagement`,href:`/wordpress-mcp-server`},heroImage:{alt:`An editorial line drawing of a small robot connecting a stack of documents to an identity shield and server`,caption:`The integration boundary—not the publishing software—does the consequential work.`,height:832,src:`/images/blog/wordpress-mcp-cloudflare/model-comparison/grok-imagine-2.jpg`,width:1248},content:`WordPress has MCP now.
306
307[WordPress.com includes a built-in MCP server on paid plans](https://developer.wordpress.com/docs/mcp/), and the WordPress project has introduced an [MCP Adapter](https://developer.wordpress.org/news/2026/02/from-abilities-to-ai-agents-introducing-the-wordpress-mcp-adapter/) that can expose registered Abilities over local or remote transports.
308
309That removes a meaningful amount of plumbing. It does not remove the hard part.
310
311For a marketing or IT leader, the real question is not whether Claude can connect to WordPress. It is whether the connection behaves like your organization: the right people, the right post types, the right fields, the right approval state, the right logs, and no production credentials scattered across laptops.
312
313That is why we have come to think of a production WordPress MCP server as a policy and integration project, not a plugin install.
314
315## The old model: give the agent broad WordPress access
316
317The shortest demo is easy to understand. Install an adapter, authenticate as an administrator, expose WordPress operations, and ask an agent to create or edit content.
318
319The production version gets uncomfortable quickly.
320
321A real WordPress site is not just posts and pages. It has custom post types, registered meta, Advanced Custom Fields, SEO plugins, media conventions, editorial states, and theme-specific assumptions. The public REST surface depends on how those pieces were registered. A custom post type needs \`show_in_rest\` enabled to use the standard controller. Custom meta needs its own REST registration and the post type must support custom fields. [WordPress documents both constraints directly](https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-rest-api-support-for-custom-content-types/).
322
323Then there is authority. “Can edit this post” is rarely the complete rule.
324
325An RSVP workflow might allow an agent to:
326
327- create a new event as a draft
328- hide it from public listings
329- enforce \`noindex,nofollow\`
330- search the existing media library
331- assign a returned image as the thumbnail
332- set a small allowlist of SEO fields
333- attach a form
334- read the finished status back
335
336It should not automatically allow the same agent to publish the event, upload arbitrary files, rewrite every protected meta key, or make a generic REST request.
337
338Raw API reach is not an operating policy.
339
340<WordPressMcpBoundaryDiagram />
341
342## The new model: a small catalog of goal-shaped tools
343
344We recently built a remote MCP prototype around an RSVP workflow for Rio.
345
346The server exposed seven tools:
347
348- \`create_rsvp_form\`
349- \`create_rsvp_event_draft\`
350- \`search_media_library\`
351- \`set_event_featured_media\`
352- \`set_event_seo\`
353- \`link_form_to_event\`
354- \`get_event_status\`
355
356The names matter. They describe the job, not the underlying endpoint.
357
358The WordPress boundary enforced the decisions that should never depend on prompt quality: the \`entertainment_events\` post type, draft-only creation, the RSVP title and slug convention, hidden listing behavior, and search-engine blocking. Media tools accepted only known images returned by search. SEO tools accepted friendly fields instead of raw protected meta keys.
359
360The prototype kept WordPress and Jotform behind deterministic shims, so it did not mutate a live site. That was deliberate. We could test the conversation, tool shapes, authorization, duplicate handling, and policy before asking for production credentials.
361
362Moving from that prototype to production is mostly adapter work:
363
364| Prototype behavior | Production boundary |
365| --- | --- |
366| Deterministic WordPress events | Authenticated WordPress REST requests |
367| Three fixed media records | Bounded media-library search |
368| Friendly SEO object | Allowlisted registered post meta |
369| Deterministic Jotform response | Jotform API request with a server-held key |
370| In-memory status | Read-back from WordPress and the form provider |
371
372The important design survives the swap. The agent still sees the same goal-shaped tools. Credentials, provider response shapes, and enforcement stay behind the server.
373
374## Why Cloudflare fits the remote boundary
375
376A remote MCP server has two different authentication problems.
377
378First, the human needs to prove they are allowed to use the server. Second, the server needs credentials for WordPress and any downstream providers.
379
380Those credentials should not be the same thing.
381
382[Cloudflare Access Managed OAuth](https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/) gives an MCP client a normal browser-login flow. Access applies identity policy, issues an opaque token to the client, and forwards a signed identity assertion to the protected origin. The Worker must validate that assertion.
383
384That produced a useful acceptance test in the Rio prototype: one allowlisted teammate could connect and see the RSVP tools; another identity received an explicit denial. Neither person stored a WordPress application password or a Jotform API key locally.
385
386Cloudflare Workers then provide the remote execution boundary:
387
388- the MCP transport lives at one HTTPS endpoint
389- Access decides which people may reach it
390- the Worker validates identity and tool input
391- secrets stay server-side
392- logs can record the user, tool name, outcome, and timing without recording payload bodies
393- stateful or asynchronous Cloudflare services can be added when a workflow earns them
394
395This is not the only viable architecture. It is a coherent one. Identity, runtime, network policy, and deployment sit close together instead of being assembled from an MCP process on one host, an OAuth service on another, and credentials on the operator's machine.
396
397## WordPress plugins are where generic tools stop being generic
398
399The plugin ecosystem is also why a single universal WordPress tool catalog has limits.
400
401Consider SEO metadata. A user thinks in terms of “SEO title,” “meta description,” or “social image.” The site may store those values in protected plugin-specific meta keys. The adapter needs to register only the keys the workflow needs, enforce the WordPress capability check, and translate the friendly MCP input into that narrow shape.
402
403The same issue appears with event plugins, custom fields, membership systems, donation platforms, and editorial workflows. A generic \`update_post\` tool either exposes too little to finish the job or too much to be comfortable.
404
405The safer pattern is:
406
4071. Start with one recurring job.
4082. Map the exact WordPress and plugin fields it needs.
4093. Make consequential states explicit.
4104. Enforce invariants on the server.
4115. Read the result back before reporting success.
412
413The agent can still be flexible in conversation. The server should be boringly strict.
414
415## The useful workflow often extends beyond WordPress
416
417MCP is the interface an agent uses. It does not require every downstream service to ship its own MCP server.
418
419Jotform is a good example. Its [REST API](https://api.jotform.com/docs/) supports forms, submissions, and webhooks using an API key. A WordPress RSVP workflow can call Jotform through an ordinary server-side adapter, return a stable form object, and then attach that form to the WordPress event.
420
421From the user's perspective, it is one job:
422
423> Create the RSVP form, create the hidden event draft, find a suitable image, apply the SEO fields, connect everything, and show me the final status.
424
425Underneath, the MCP server coordinates two providers with different authentication and data models. The skill or prompt teaches the sequence and handles ambiguity. The server owns credentials, validation, and policy.
426
427That division is useful well beyond forms. The same server can coordinate a DAM, CRM, analytics service, approval system, or internal API whether or not any of them advertise an MCP endpoint.
428
429## What production readiness actually includes
430
431The code for a few tools is only part of the engagement.
432
433A production WordPress MCP server needs:
434
435- a written tool and permission map
436- an identity policy and clean-profile login test
437- narrow WordPress and provider credentials
438- explicit draft, publish, delete, and update behavior
439- plugin and custom-field mapping
440- structured logs that avoid sensitive payloads
441- repeatable tests for policy and provider response changes
442- dependency and protocol maintenance
443- an operator handoff for access, revocation, and incident response
444
445That is also why maintenance matters. WordPress plugins change fields. Provider APIs change responses. MCP clients and SDKs move. Cloudflare's current Agents integration and the MCP specification will not remain frozen around the first deploy.
446
447The goal is not to turn a small integration into a platform program. It is to keep a consequential interface small, legible, and maintained.
448
449## The implication for marketing and IT teams
450
451If the only requirement is broad access to standard WordPress content, start with the first-party options. They may be enough.
452
453If the requirement is a specific operating recipe across custom WordPress behavior and other services, design that workflow before choosing tools. Decide who can act, what must remain a draft, which fields are allowed, where credentials live, and what evidence proves the work completed.
454
455Then expose the smallest MCP surface that can finish the job.
456
457We now offer that first production setup as a fixed [$10,000 WordPress MCP server engagement](/wordpress-mcp-server). The price is intentionally visible. This is for teams that need an identity-aware, policy-bound integration—not a quick experiment with a generic plugin.
458
459<FAQ title="WordPress MCP server questions">
460  <FAQItem question="Does WordPress already have an MCP server?">
461    Yes. WordPress.com offers a built-in MCP server on paid plans, and the WordPress MCP Adapter can expose registered Abilities. A custom server is useful when the workflow needs organization-specific policy, custom post types, plugin fields, identity, or other providers.
462  </FAQItem>
463
464<FAQItem question="Why put a WordPress MCP server on Cloudflare?">
465  Cloudflare can provide the remote Worker runtime and an identity-aware Access
466  boundary. Managed OAuth gives interactive MCP clients a browser-login flow,
467  while WordPress and provider credentials remain at the server.
468</FAQItem>
469
470<FAQItem question="Can an MCP server use a service that does not support MCP?">
471  Yes. MCP is the interface between the agent and your server. The server can
472  call an ordinary REST or GraphQL API behind a narrow tool. Jotform's REST API
473  is one example.
474</FAQItem>
475
476  <FAQItem question="Should the agent get a generic WordPress REST tool?">
477    Usually not for production marketing work. Goal-shaped tools make the allowed job clear and let the server enforce draft states, post-type allowlists, plugin fields, and read-back checks.
478  </FAQItem>
479</FAQ>`,_meta:{filePath:`wordpress-mcp-cloudflare.mdx`,fileName:`wordpress-mcp-cloudflare.mdx`,directory:`.`,extension:`mdx`,path:`wordpress-mcp-cloudflare`},mdxSource:`WordPress has MCP now.
480
481[WordPress.com includes a built-in MCP server on paid plans](https://developer.wordpress.com/docs/mcp/), and the WordPress project has introduced an [MCP Adapter](https://developer.wordpress.org/news/2026/02/from-abilities-to-ai-agents-introducing-the-wordpress-mcp-adapter/) that can expose registered Abilities over local or remote transports.
482
483That removes a meaningful amount of plumbing. It does not remove the hard part.
484
485For a marketing or IT leader, the real question is not whether Claude can connect to WordPress. It is whether the connection behaves like your organization: the right people, the right post types, the right fields, the right approval state, the right logs, and no production credentials scattered across laptops.
486
487That is why we have come to think of a production WordPress MCP server as a policy and integration project, not a plugin install.
488
489## The old model: give the agent broad WordPress access
490
491The shortest demo is easy to understand. Install an adapter, authenticate as an administrator, expose WordPress operations, and ask an agent to create or edit content.
492
493The production version gets uncomfortable quickly.
494
495A real WordPress site is not just posts and pages. It has custom post types, registered meta, Advanced Custom Fields, SEO plugins, media conventions, editorial states, and theme-specific assumptions. The public REST surface depends on how those pieces were registered. A custom post type needs \`show_in_rest\` enabled to use the standard controller. Custom meta needs its own REST registration and the post type must support custom fields. [WordPress documents both constraints directly](https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-rest-api-support-for-custom-content-types/).
496
497Then there is authority. “Can edit this post” is rarely the complete rule.
498
499An RSVP workflow might allow an agent to:
500
501- create a new event as a draft
502- hide it from public listings
503- enforce \`noindex,nofollow\`
504- search the existing media library
505- assign a returned image as the thumbnail
506- set a small allowlist of SEO fields
507- attach a form
508- read the finished status back
509
510It should not automatically allow the same agent to publish the event, upload arbitrary files, rewrite every protected meta key, or make a generic REST request.
511
512Raw API reach is not an operating policy.
513
514<WordPressMcpBoundaryDiagram />
515
516## The new model: a small catalog of goal-shaped tools
517
518We recently built a remote MCP prototype around an RSVP workflow for Rio.
519
520The server exposed seven tools:
521
522- \`create_rsvp_form\`
523- \`create_rsvp_event_draft\`
524- \`search_media_library\`
525- \`set_event_featured_media\`
526- \`set_event_seo\`
527- \`link_form_to_event\`
528- \`get_event_status\`
529
530The names matter. They describe the job, not the underlying endpoint.
531
532The WordPress boundary enforced the decisions that should never depend on prompt quality: the \`entertainment_events\` post type, draft-only creation, the RSVP title and slug convention, hidden listing behavior, and search-engine blocking. Media tools accepted only known images returned by search. SEO tools accepted friendly fields instead of raw protected meta keys.
533
534The prototype kept WordPress and Jotform behind deterministic shims, so it did not mutate a live site. That was deliberate. We could test the conversation, tool shapes, authorization, duplicate handling, and policy before asking for production credentials.
535
536Moving from that prototype to production is mostly adapter work:
537
538| Prototype behavior | Production boundary |
539| --- | --- |
540| Deterministic WordPress events | Authenticated WordPress REST requests |
541| Three fixed media records | Bounded media-library search |
542| Friendly SEO object | Allowlisted registered post meta |
543| Deterministic Jotform response | Jotform API request with a server-held key |
544| In-memory status | Read-back from WordPress and the form provider |
545
546The important design survives the swap. The agent still sees the same goal-shaped tools. Credentials, provider response shapes, and enforcement stay behind the server.
547
548## Why Cloudflare fits the remote boundary
549
550A remote MCP server has two different authentication problems.
551
552First, the human needs to prove they are allowed to use the server. Second, the server needs credentials for WordPress and any downstream providers.
553
554Those credentials should not be the same thing.
555
556[Cloudflare Access Managed OAuth](https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/) gives an MCP client a normal browser-login flow. Access applies identity policy, issues an opaque token to the client, and forwards a signed identity assertion to the protected origin. The Worker must validate that assertion.
557
558That produced a useful acceptance test in the Rio prototype: one allowlisted teammate could connect and see the RSVP tools; another identity received an explicit denial. Neither person stored a WordPress application password or a Jotform API key locally.
559
560Cloudflare Workers then provide the remote execution boundary:
561
562- the MCP transport lives at one HTTPS endpoint
563- Access decides which people may reach it
564- the Worker validates identity and tool input
565- secrets stay server-side
566- logs can record the user, tool name, outcome, and timing without recording payload bodies
567- stateful or asynchronous Cloudflare services can be added when a workflow earns them
568
569This is not the only viable architecture. It is a coherent one. Identity, runtime, network policy, and deployment sit close together instead of being assembled from an MCP process on one host, an OAuth service on another, and credentials on the operator's machine.
570
571## WordPress plugins are where generic tools stop being generic
572
573The plugin ecosystem is also why a single universal WordPress tool catalog has limits.
574
575Consider SEO metadata. A user thinks in terms of “SEO title,” “meta description,” or “social image.” The site may store those values in protected plugin-specific meta keys. The adapter needs to register only the keys the workflow needs, enforce the WordPress capability check, and translate the friendly MCP input into that narrow shape.
576
577The same issue appears with event plugins, custom fields, membership systems, donation platforms, and editorial workflows. A generic \`update_post\` tool either exposes too little to finish the job or too much to be comfortable.
578
579The safer pattern is:
580
5811. Start with one recurring job.
5822. Map the exact WordPress and plugin fields it needs.
5833. Make consequential states explicit.
5844. Enforce invariants on the server.
5855. Read the result back before reporting success.
586
587The agent can still be flexible in conversation. The server should be boringly strict.
588
589## The useful workflow often extends beyond WordPress
590
591MCP is the interface an agent uses. It does not require every downstream service to ship its own MCP server.
592
593Jotform is a good example. Its [REST API](https://api.jotform.com/docs/) supports forms, submissions, and webhooks using an API key. A WordPress RSVP workflow can call Jotform through an ordinary server-side adapter, return a stable form object, and then attach that form to the WordPress event.
594
595From the user's perspective, it is one job:
596
597> Create the RSVP form, create the hidden event draft, find a suitable image, apply the SEO fields, connect everything, and show me the final status.
598
599Underneath, the MCP server coordinates two providers with different authentication and data models. The skill or prompt teaches the sequence and handles ambiguity. The server owns credentials, validation, and policy.
600
601That division is useful well beyond forms. The same server can coordinate a DAM, CRM, analytics service, approval system, or internal API whether or not any of them advertise an MCP endpoint.
602
603## What production readiness actually includes
604
605The code for a few tools is only part of the engagement.
606
607A production WordPress MCP server needs:
608
609- a written tool and permission map
610- an identity policy and clean-profile login test
611- narrow WordPress and provider credentials
612- explicit draft, publish, delete, and update behavior
613- plugin and custom-field mapping
614- structured logs that avoid sensitive payloads
615- repeatable tests for policy and provider response changes
616- dependency and protocol maintenance
617- an operator handoff for access, revocation, and incident response
618
619That is also why maintenance matters. WordPress plugins change fields. Provider APIs change responses. MCP clients and SDKs move. Cloudflare's current Agents integration and the MCP specification will not remain frozen around the first deploy.
620
621The goal is not to turn a small integration into a platform program. It is to keep a consequential interface small, legible, and maintained.
622
623## The implication for marketing and IT teams
624
625If the only requirement is broad access to standard WordPress content, start with the first-party options. They may be enough.
626
627If the requirement is a specific operating recipe across custom WordPress behavior and other services, design that workflow before choosing tools. Decide who can act, what must remain a draft, which fields are allowed, where credentials live, and what evidence proves the work completed.
628
629Then expose the smallest MCP surface that can finish the job.
630
631We now offer that first production setup as a fixed [$10,000 WordPress MCP server engagement](/wordpress-mcp-server). The price is intentionally visible. This is for teams that need an identity-aware, policy-bound integration—not a quick experiment with a generic plugin.
632
633<FAQ title="WordPress MCP server questions">
634  <FAQItem question="Does WordPress already have an MCP server?">
635    Yes. WordPress.com offers a built-in MCP server on paid plans, and the WordPress MCP Adapter can expose registered Abilities. A custom server is useful when the workflow needs organization-specific policy, custom post types, plugin fields, identity, or other providers.
636  </FAQItem>
637
638<FAQItem question="Why put a WordPress MCP server on Cloudflare?">
639  Cloudflare can provide the remote Worker runtime and an identity-aware Access
640  boundary. Managed OAuth gives interactive MCP clients a browser-login flow,
641  while WordPress and provider credentials remain at the server.
642</FAQItem>
643
644<FAQItem question="Can an MCP server use a service that does not support MCP?">
645  Yes. MCP is the interface between the agent and your server. The server can
646  call an ordinary REST or GraphQL API behind a narrow tool. Jotform's REST API
647  is one example.
648</FAQItem>
649
650  <FAQItem question="Should the agent get a generic WordPress REST tool?">
651    Usually not for production marketing work. Goal-shaped tools make the allowed job clear and let the server enforce draft states, post-type allowlists, plugin fields, and read-back checks.
652  </FAQItem>
653</FAQ>`,slug:`wordpress-mcp-cloudflare`}],a=[{title:`About Patronage`,description:`Patronage is the executional layer for teams with strong strategy: web development, SEO and AdWords, and campaign automation run as one operating loop.`,content:`AI made production cheap. Anyone can generate a campaign, a landing page, a hundred variations of an ad. What got harder is everything around it: deciding what is worth making, getting it live, reading the results, and adjusting before the moment passes. The bottleneck moved from production to decision quality and operations.
654
655That is the gap we close. Patronage is the executional layer for teams that already have strong strategy. You bring the judgment about where to go; we build and run the operating loop that gets you there: research, generate, launch, measure, adapt. You stay the one making the calls. We make sure the calls turn into shipped work and honest feedback.
656
657We work with brands, agencies, and nonprofits, mostly across:
658
659- [Web development](/offerings/web-development)
660- [SEO and AdWords](/offerings/seo-and-adwords)
661- [Campaign automation](/offerings/campaign-automation)
662- [ReportSprint](/report-sprint)
663
664Founded by Cameron Corda and operating since 2025, Patronage stays deliberately small and hands-on. We are not here to replace your team or hand you another dashboard to babysit. We are here to turn signal into action, consistently.
665
666If that sounds like the layer you are missing, get in touch.`,_meta:{filePath:`about.mdx`,fileName:`about.mdx`,directory:`.`,extension:`mdx`,path:`about`},mdxSource:`AI made production cheap. Anyone can generate a campaign, a landing page, a hundred variations of an ad. What got harder is everything around it: deciding what is worth making, getting it live, reading the results, and adjusting before the moment passes. The bottleneck moved from production to decision quality and operations.
667
668That is the gap we close. Patronage is the executional layer for teams that already have strong strategy. You bring the judgment about where to go; we build and run the operating loop that gets you there: research, generate, launch, measure, adapt. You stay the one making the calls. We make sure the calls turn into shipped work and honest feedback.
669
670We work with brands, agencies, and nonprofits, mostly across:
671
672- [Web development](/offerings/web-development)
673- [SEO and AdWords](/offerings/seo-and-adwords)
674- [Campaign automation](/offerings/campaign-automation)
675- [ReportSprint](/report-sprint)
676
677Founded by Cameron Corda and operating since 2025, Patronage stays deliberately small and hands-on. We are not here to replace your team or hand you another dashboard to babysit. We are here to turn signal into action, consistently.
678
679If that sounds like the layer you are missing, get in touch.`,slug:`about`},{title:`Privacy Policy`,description:`What the Patronage website collects, why, and the choices you have. No ad pixels, no data sales, no accounts.`,content:`**Effective date:** June 10, 2026
680
681This is the privacy policy for the Patronage website. Patronage is a small US-based marketing operations agency. This page explains what we collect when you visit the site, why, and what you can do about it. We do not sell personal data, we do not run advertising pixels, and there are no accounts or logins on this site.
682
683## What we collect
684
685Two kinds of information:
686
687- **Usage data**, gathered automatically as you browse: pages viewed, approximate location, device and browser type, referring links, and similar analytics signals.
688- **Information you give us**, if you choose to: your name, email, and message when you submit the contact form, and any details you share if you book a call.
689
690## Analytics
691
692We use two analytics tools to understand how the site is used and to improve it:
693
694- **PostHog** - product and web analytics, served first-party through our own domain.
695- **Google Analytics 4**, loaded via **Google Tag Manager** - aggregate traffic reporting.
696
697These tools measure traffic in aggregate. We use them to see what is working on the site, not to build advertising profiles of you.
698
699## Contact form data
700
701When you submit our contact form, you share your name, email, and message with us. The form is powered by **Quirello**, which processes the submission and passes it to us. We use that information to read and reply to you. If you use the optional **Cal.com** scheduling link to book a call, Cal.com collects the details needed to schedule the meeting.
702
703We do not add you to marketing lists from a contact-form submission without your okay.
704
705## Cookies
706
707Our analytics tools may set cookies or use similar storage to re
707cognize return visits and measure usage. These are functional and analytics cookies, not advertising cookies. You can block or clear cookies in your browser settings; the site will still work.
708
709## Data sharing
710
711We do not sell your personal data, and we do not share it for advertising. We share data only with the service providers that run this site and its tools:
712
713- **Cloudflare** - hosting, content delivery, and security (including server logs)
714- **PostHog** and **Google (Analytics 4 / Tag Manager)** - analytics
715- **Quirello** - contact form processing
716- **Cal.com** - optional call scheduling
717
718Each of these processes data on our behalf so the site can function. We may also disclose information if required by law.
719
720## Retention
721
722We keep contact-form messages and scheduling details for as long as needed to respond to you and maintain normal business records, then delete them when they are no longer useful. Analytics data is retained according to each tool's standard settings. Server logs are short-lived and used for security and reliability.
723
724## Your choices and rights
725
726- **Cookies:** block or clear them anytime in your browser. Content blockers will also stop our analytics tools entirely, and the site will still work.
727- **Contact info:** the contact form and scheduling link are optional.
728- **Access and deletion:** you can request a copy of the personal information we hold about you, or ask us to delete it, by emailing [[email protected]](mailto:[email protected]). This includes rights under the CCPA if you are a California resident. We will verify your request and respond within a reasonable time, and you will not be treated differently for exercising these rights.
729
730## Changes
731
732If we change this policy, we will update the effective date above. Material changes will be reflected on this page.
733
734## Contact
735
736Questions about privacy or this policy? Email [[email protected]](mailto:[email protected]).`,_meta:{filePath:`privacy.mdx`,fileName:`privacy.mdx`,directory:`.`,extension:`mdx`,path:`privacy`},mdxSource:`**Effective date:** June 10, 2026
737
738This is the privacy policy for the Patronage website. Patronage is a small US-based marketing operations agency. This page explains what we collect when you visit the site, why, and what you can do about it. We do not sell personal data, we do not run advertising pixels, and there are no accounts or logins on this site.
739
740## What we collect
741
742Two kinds of information:
743
744- **Usage data**, gathered automatically as you browse: pages viewed, approximate location, device and browser type, referring links, and similar analytics signals.
745- **Information you give us**, if you choose to: your name, email, and message when you submit the contact form, and any details you share if you book a call.
746
747## Analytics
748
749We use two analytics tools to understand how the site is used and to improve it:
750
751- **PostHog** - product and web analytics, served first-party through our own domain.
752- **Google Analytics 4**, loaded via **Google Tag Manager** - aggregate traffic reporting.
753
754These tools measure traffic in aggregate. We use them to see what is working on the site, not to build advertising profiles of you.
755
756## Contact form data
757
758When you submit our contact form, you share your name, email, and message with us. The form is powered by **Quirello**, which processes the submission and passes it to us. We use that information to read and reply to you. If you use the optional **Cal.com** scheduling link to book a call, Cal.com collects the details needed to schedule the meeting.
759
760We do not add you to marketing lists from a contact-form submission without your okay.
761
762## Cookies
763
764Our analytics tools may set cookies or use similar storage to recognize return visits and measure usage. These are functional and analytics cookies, not advertising cookies. You can block or clear cookies in your browser settings; the site will still work.
765
766## Data sharing
767
768We do not sell your personal data, and we do not share it for advertising. We share data only with the service providers that run this site and its tools:
769
770- **Cloudflare** - hosting, content delivery, and security (including server logs)
771- **PostHog** and **Google (Analytics 4 / Tag Manager)** - analytics
772- **Quirello** - contact form processing
773- **Cal.com** - optional call scheduling
774
775Each of these processes data on our behalf so the site can function. We may also disclose information if required by law.
776
777## Retention
778
779We keep contact-form messages and scheduling details for as long as needed to respond to you and maintain normal business records, then delete them when they are no longer useful. Analytics data is retained according to each tool's standard settings. Server logs are short-lived and used for security and reliability.
780
781## Your choices and rights
782
783- **Cookies:** block or clear them anytime in your browser. Content blockers will also stop our analytics tools entirely, and the site will still work.
784- **Contact info:** the contact form and scheduling link are optional.
785- **Access and deletion:** you can request a copy of the personal information we hold about you, or ask us to delete it, by emailing [[email protected]](mailto:[email protected]). This includes rights under the CCPA if you are a California resident. We will verify your request and respond within a reasonable time, and you will not be treated differently for exercising these rights.
786
787## Changes
788
789If we change this policy, we will update the effective date above. Material changes will be reflected on this page.
790
791## Contact
792
793Questions about privacy or this policy? Email [[email protected]](mailto:[email protected]).`,slug:`privacy`},{title:`Standard Service Terms`,description:`The standard commercial terms for fixed-scope and recurring Patronage service engagements.`,content:`Effective July 28, 2026
794
795These Standard Service Terms apply to productized Patronage engagements that link to this page. A proposal, order form, or statement of work accepted by both parties (an **Order**) may add project-specific scope, timing, and fees. If an Order conflicts with these terms, the Order controls for that engagement.
796
797## Scope and changes
798
799Patronage will provide the services and deliverables described in the Order. Work outside that scope requires written approval and may require a new Order or additional fees.
800
801Client will provide timely access, information, approvals, accounts, and personnel reasonably needed to perform the work. Dates move when a required client dependency is late.
802
803## Fees and payment
804
805Setup fees are due according to the Order. Patronage may accept payment by credit card or invoice for a fixed setup engagement.
806
807Recurring monthly services require a valid credit card on file and are billed in advance. Approved pass-through costs and usage-based third-party charges may be billed separately. Fees are non-refundable once the corresponding work period begins, except where the Order expressly says otherwise.
808
809Past-due amounts may pause work. Client remains responsible for fees already incurred and for approved non-cancellable commitments.
810
811## Third-party services
812
813Some work depends on services such as Cloudflare, WordPress hosting, plugins, model providers, forms, analytics, scheduling, or other client-selected systems. Client is responsible for its accounts, licenses, provider terms, and provider charges unless the Order says otherwise.
814
815Patronage is not responsible for a third party changing, suspending, or discontinuing its service. We will identify a practical adjustment when that change affects the agreed workflow; material rework may require a scope change.
816
817## Security and access
818
819Each party will use reasonable safeguards for credentials and confidential information. Client authorizes Patronage to access the systems listed in the Order only as needed to perform the services.
820
821Client is responsible for deciding who may approve or use production capabilities. Patronage may refuse a requested configuration that would create an unsafe public mutation surface, expose credentials, or bypass an agreed approval boundary.
822
823## Intellectual property
824
825Client retains ownership of its pre-existing materials, data, trademarks, and content. Patronage retains ownership of its pre-existing software, methods, templates, libraries, skills, and general know-how.
826
827After full payment, Client owns the custom deliverables identified in the Order. Patronage may continue to use generalized ideas, non-client-specific improvements, and pre-existing components, provided we do not disclose Client confidential information.
828
829## Confidentiality
830
831Each party will protect the other party's non-public business, technical, and customer information and use it only for the engagement. This obligation does not cover information that is public through no breach, already known without restriction, independently developed, or lawfully received from another source.
832
833## Warranty and limitation
834
835Patronage will perform the services professionally and materially according to the Order. Client's exclusive remedy for a verified breach of that promise is re-performance of the affected services, if Client notifies Patronage promptly.
836
837Except for that promise, the services and deliverables are provided as-is to the maximum extent allowed by law. Neither party is liable for indirect, incidental, special, exemplary, or consequential damages, or for lost profits or revenue. Eac
837h party's total liability arising from an engagement will not exceed the fees paid or payable under the applicable Order during the six months before the event giving rise to the claim.
838
839## Term and termination
840
841Either party may terminate for a material breach that remains uncured for ten days after written notice. Either party may terminate recurring services at the end of the current paid monthly period by giving written notice before the next billing date, unless the Order states a longer initial term.
842
843On termination, Client will pay for completed work, work in progress, and approved non-cancellable commitments through the effective termination date. Provisions that by their nature should survive will survive, including payment, confidentiality, intellectual property, warranty limitations, and liability limits.
844
845## General
846
847Neither party may assign an engagement without the other party's written consent, except in connection with a merger, acquisition, or sale of substantially all assets. Neither party is responsible for delay caused by events outside its reasonable control.
848
849These terms and the applicable Order are the entire agreement for the engagement and replace prior discussions about the same services. Changes must be in 
849writing and accepted by both parties.
850
851Questions about these terms may be sent to [[email protected]](mailto:[email protected]).`,_meta:{filePath:`terms.mdx`,fileName:`terms.mdx`,directory:`.`,extension:`mdx`,path:`terms`},mdxSource:`Effective July 28, 2026
852
853These Standard Service Terms apply to productized Patronage engagements that link to this page. A proposal, order form, or statement of work accepted by both parties (an **Order**) may add project-specific scope, timing, and fees. If an Order conflicts with these terms, the Order controls for that engagement.
854
855## Scope and changes
856
857Patronage will provide the services and deliverables described in the Order. Work outside that scope requires written approval and may require a new Order or additional fees.
858
859Client will provide timely access, information, approvals, accounts, and personnel reasonably needed to perform the work. Dates move when a required client dependency is late.
860
861## Fees and payment
862
863Setup fees are due according to the Order. Patronage may accept payment by credit card or invoice for a fixed setup engagement.
864
865Recurring monthly services require a valid credit card on file and are billed in advance. Approved pass-through costs and usage-based third-party charges may be billed separately. Fees are non-refundable once the corresponding work period begins, except where the Order expressly says otherwise.
866
867Past-due amounts may pause work. Client remains responsible for fees already incurred and for approved non-cancellable commitments.
868
869## Third-party services
870
871Some work depends on services such as Cloudflare, WordPress hosting, plugins, model providers, forms, analytics, scheduling, or other client-selected systems. Client is responsible for its accounts, licenses, provider terms, and provider charges unless the Order says otherwise.
872
873Patronage is not responsible for a third party changing, suspending, or discontinuing its service. We will identify a practical adjustment when that change affects the agreed workflow; material rework may require a scope change.
874
875## Security and access
876
877Each party will use reasonable safeguards for credentials and confidential information. Client authorizes Patronage to access the systems listed in the Order only as needed to perform the services.
878
879Client is responsible for deciding who may approve or use production capabilities. Patronage may refuse a requested configuration that would create an unsafe public mutation surface, expose credentials, or bypass an agreed approval boundary.
880
881## Intellectual property
882
883Client retains ownership of its pre-existing materials, data, trademarks, and content. Patronage retains ownership of its pre-existing software, methods, templates, libraries, skills, and general know-how.
884
885After full payment, Client owns the custom deliverables identified in the Order. Patronage may continue to use generalized ideas, non-client-specific improvements, and pre-existing components, provided we do not disclose Client confidential information.
886
887## Confidentiality
888
889Each party will protect the other party's non-public business, technical, and customer information and use it only for the engagement. This obligation does not cover information that is public through no breach, already known without restriction, independently developed, or lawfully received from another source.
890
891## Warranty and limitation
892
893Patronage will perform the services professionally and materially according to the Order. Client's exclusive remedy for a verified breach of that promise is re-performance of the affected services, if Client notifies Patronage promptly.
894
895Except for that promise, the services and deliverables are provided as-is to the maximum extent allowed by law. Neither party is liable for indirect, incidental, special, exemplary, or consequential damages, or for lost profits or revenue. Each party's total liability arising from an engagement will not exceed the fees paid or payable under the applicable Order during the six months before the event giving rise to the claim.
896
897## Term and termination
898
899Either party may terminate for a material breach that remains uncured for ten days after written notice. Either party may terminate recurring services at the end of the current paid monthly period by giving written notice before the next billing date, unless the Order states a longer initial term.
900
901On termination, Client will pay for completed work, work in progress, and approved non-cancellable commitments through the effective termination date. Provisions that by their nature should survive will survive, including payment, confidentiality, intellectual property, warranty limitations, and liability limits.
902
903## General
904
905Neither party may assign an engagement without the other party's written consent, except in connection with a merger, acquisition, or sale of substantially all assets. Neither party is responsible for delay caused by events outside its reasonable control.
906
907These terms and the applicable Order are the entire agreement for the engagement and replace prior discussions about the same services. Changes must be in 
907writing and accepted by both parties.
908
909Questions about these terms may be sent to [[email protected]](mailto:[email protected]).`,slug:`terms`}],o=e(`previewDrafts`);function s(e){return o||!e.draft}var c=i.filter(s),l=t.filter(s),u=r.filter(s),d=a.filter(s),f=n.filter(s);function p(e){return l.filter(t=>t.projectSlug===e)}function m(e){return l.filter(t=>t.offeringSlugs.includes(e))}function h(e){return c.filter(t=>t.offeringSlugs?.includes(e))}function g(e){return f.find(t=>t.slug===e)}function _(e){return u.find(t=>t.slug===e)}function v(e){return c.find(t=>t.slug===e)}function y(e){return l.find(t=>t.slug===e)}function b(e){return d.find(t=>t.slug===e)}function x(e){let t=b(e);if(!t)throw Error(`Missing content/pages/${e}.mdx`);return t}export{y as a,c,f as d,x as f,p as i,l,h as n,_ as o,m as r,g as s,v as t,u};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.