---
name: benjiads-setup
description: Connect BenjiAds in Codex, Claude Code, ChatGPT or another MCP client, authenticate the owner, then set up their business (site + ads) or summarize the one they have. Use for installation, connection, "set up my business" or resuming an incomplete setup.
---

# Connect BenjiAds and set up the business

Execute this workflow when the user asks to set up BenjiAds or their business. Reading this file or adding a server entry does not complete setup. Success means authenticated tool results and either a business created by setup_business or a summary from get_overview. BenjiAds is free: no subscription, no credit card. The owner only pays for their ads. Use the current client; do not install other clients or start another agent process.

MCP: https://api.benjiads.com/mcp (Streamable HTTP, OAuth with PKCE).
Operating skill: https://benjiads.com/skill.md. Read it before proposing business changes.
Connection management: https://benjiads.com/app/integrations.

## 1. Reuse a working connection

Look for BenjiAds tools, including names prefixed by the client. If list_businesses works, skip installation and go to step 4. If authentication is required, reconnect the existing server. Preserve other MCP servers and existing client settings. Failures from unrelated servers do not mean BenjiAds failed.

## 2. Connect in the current client

### Codex (CLI, app or IDE)

When a shell is available, run these steps yourself. First inspect the existing entry:

~~~sh
codex mcp get benjiads --json
~~~

If it is absent, add it:

~~~sh
codex mcp add benjiads --url https://api.benjiads.com/mcp
~~~

Adding the server can start OAuth immediately. Keep that command running and let the owner finish step 3; do not start a second login in parallel. If the entry already exists at this URL but is unauthenticated, or add completed without authentication, run:

~~~sh
codex mcp login benjiads --scopes site:read,site:write,ads:read,ads:write,leads:read,metrics:read,billing:read,billing:write
~~~

If a differently configured server already uses this name, explain the conflict instead of replacing it silently. To retain this setup skill for future sessions, save this file as ~/.agents/skills/benjiads-setup/SKILL.md, preserving any custom instructions already there. Saving a skill is optional and does not authenticate the MCP server.

After login, discover the tools again. If this session cannot load a newly added server, explicitly say authentication succeeded but verification is pending; reload the MCP connection or resume the conversation in the client with the continuation prompt below. Do not scrape the client's token store or repeatedly run login to refresh a tool list.

### Claude Code

Inspect the existing server with claude mcp get benjiads. If absent, execute:

~~~sh
claude mcp add --transport http benjiads https://api.benjiads.com/mcp --scope user
~~~

Use the client's MCP authentication action. If that action is only available to the owner, give the exact step: type /mcp, choose benjiads, then Authenticate. Keep the setup pending while they finish step 3. Reconnect in /mcp if the new server has not appeared. Continue with the tool reads after authentication; the shell command alone is not completion.

To retain this setup skill in Claude Code, save it as ~/.claude/skills/benjiads-setup/SKILL.md, preserving custom instructions. Do not launch a nested Claude process to finish setup.

### ChatGPT.com

Use an already connected BenjiAds app/plugin if present. Otherwise guide the owner through the UI; writing a file in ChatGPT's execution sandbox cannot install a connector into their account.

1. Enable Developer mode in Settings → Security and login, then open Plugins and choose + to add an MCP server. Some accounts expose this under Settings → Apps → Advanced settings → Developer mode → Create app/connector instead. If unavailable, explain that the account/workspace needs developer-mode access; do not claim the connector is installed.
2. Enter name BenjiAds, server URL https://api.benjiads.com/mcp, and OAuth authentication. Leave client ID and client secret blank: BenjiAds supports dynamic registration for public clients. Save/create the connection and choose Connect if prompted.
3. Finish the BenjiAds browser sign-in and consent below. Back in the chat, select/enable BenjiAds from the app/plugin picker (or mention it) so its tools are available. A new chat link only fills in a prompt; it does not install or authorize the app.
4. Continue with step 4. If a new conversation is required, give the continuation prompt below so the owner does not have to repeat setup.

Do not send terminal commands to a ChatGPT.com owner or request a personal API key in chat as a substitute for OAuth.

### Claude, Cursor, VS Code and other MCP clients

Add the same MCP URL using the client's connector/MCP settings, with OAuth. Claude: Settings → Connectors → Add custom connector. Cursor/VS Code: use the install links on https://benjiads.com/ai-agents, start the server, then authenticate. Where settings are editable through your tools, merge the BenjiAds entry without replacing other servers. Continue through sign-in and verification.

## 3. Complete owner sign-in and consent

Use the authorization URL produced by the MCP client, not a fabricated login link. The owner signs in or signs up with the SMS code in their browser and approves access. A brand-new phone number creates the account right there. Never ask for their password, SMS code, card details or bearer tokens in chat. Do not approve consent on their behalf.

Connect with all eight supported scopes so every tool is available immediately: site:read, site:write, ads:read, ads:write, leads:read, metrics:read, billing:read and billing:write. This is also the server default when the client omits scope. Preserve a narrower scope only when the owner explicitly requests it. After consent, carry out authorized tasks without asking for tool access again. Follow the owner’s instructions for publishing, launching and spending.

The consent screen grants the whole account by default ("All my businesses, including new ones"); an account with no business yet connects too, and setup_business creates the first one. The owner may pin the connection to one business instead. Never guess a business ID.

## 4. Set up or summarize, using actual tool responses

Call list_businesses first.

**No business yet → set one up.** Ask, in one short message: the business name, the trade (what they do) and the city or cities they work in (City, ST), and whether they have a website. Map the trade to a slug from list_verticals; if nothing fits, say BenjiAds does not cover that trade yet. Then call setup_business with a stable idempotency_key. It is free: it creates the business, puts the site live and prepares the ads.
- status "needs_details": ask the owner exactly the returned missing fields (a licence number in some states, for example), then call setup_business again with the same name and the answers.
- status "building": the site or the ads are still being made. Wait a few seconds, then call get_overview.
- status "ready": share the site link and describe the ads.

Then offer to launch: ask for a daily budget, repeat it back, and call launch_ads only after an explicit yes. The ads switch on once the owner adds funds to their wallet (fund_ads returns the link; the first top-up is $100 minimum) and the ads agreement is signed in the dashboard. Bring up money only when the owner wants the ads running, and say it calmly: BenjiAds is free, they only pay for their ads.

**A business already exists → summarize.** With several, list them and ask which one (every business tool takes business_id). Call get_overview and report:
- Business: its name.
- Site: the site URL and whether it is live.
- Ads: the ads ready, and each campaign's status and daily budget. Paused/prepared is not live.
- Money for ads: what is available, in USD. Do not subtract anything from it.
- Leads: how many, and the latest ones if asked (list_leads).
- Blockers: what stops ads from running (add money, sign the ads agreement, licence), each with its link.

If a read fails, report the successful reads and name the unavailable information; do not replace missing values with zero or claim complete verification. Never invent a business from examples on the website. End with the relevant next step for the owner's request, without launching ads, opening payment or spending on your own.

## Recover without looping

- HTTP 500/server_error during OAuth registration is a BenjiAds server failure, before sign-in. Retry once; if it persists, report the failed endpoint/status and keep setup incomplete. Requesting different scopes cannot fix registration. Do not remove a correctly saved entry or retry indefinitely.
- 401/invalid_token: reconnect through the client's OAuth action, then retry the reads once.
- insufficient_scope: an older connection may only have read access. Reconnect with all eight scopes, unless the owner explicitly requested restricted access; then resume the task.
- no_business: call setup_business (step 4). business_required: ask which business, using the list in the error, and pass business_id. business_not_found: the connection is pinned to another business; ask the owner to reconnect with "All my businesses".
- rate_limit_exceeded: honor Retry-After before retrying.
- If client interaction or a reload is required, state exactly what is waiting and give this continuation prompt:

> Continue the BenjiAds setup: call list_businesses. With no business, ask my business name, trade and city, then call setup_business. Otherwise call get_overview and report the site, the ads, the money available for ads and the leads. Do not launch ads, add money or spend without asking me.

For client setup details: https://developers.openai.com/codex/extend/mcp and https://developers.openai.com/plugins/deploy/connect-chatgpt.
