Claude Connector

Ask Claude about every client account

An agency running twenty accounts can see everything in the app — one page at a time. What you can't see is the portfolio: which client never got CallRail connected, which one has been failing its sync for a fortnight, which is spending against a budget nobody ever set. Add PPC TNT to Claude as a custom connector and just ask.

Set it up → For agencies
U
Which of my clients aren't fully set up?
PPC TNT · audit_setup(scope: all) → 21 accounts checked
Four need attention.

critical Ace Plumbing — Google Ads is spending and no CRM is connected, so nothing is attributing to revenue.
critical Northside HVAC — Housecall Pro sync has been failing for 12 days.
warning Delta Roofing — spending $4.1k MTD with no attributed revenue at all.
warning Kerr Electric — no call tracking, so calls aren't reaching Google Ads as conversions.

The other 17 are clean. Want the fix path for any of these?
U
Post the Northside one to their Jira issue.
I'll comment on ACME‑412, the issue linked to Northside HVAC. Confirm and I'll post it.

Nine questions it can answer

These aren't a generic database wrapper. Each one answers a question agencies actually ask, using the same maths the app's own pages use — so the Reporting page and Claude can't quote you different numbers.

list_client_accounts

What accounts exist, and how each one is doing month-to-date.

audit_setup

What's missing or not connected, ranked, per account and across the whole portfolio.

find_improvements

Where to improve, ranked by the money at stake rather than by how easy it is to say.

get_performance_report

Pacing against budget, cost per lead against target CPA, and the lead-tracking gap.

get_activity_log

When each thing last ran — and which accounts have gone quiet.

get_client_account

One account in full detail, when the portfolio view has pointed you at it.

query_records

Specific numbers out of calls, jobs, spend and change history.

get_jira_links

What's linked to Jira, and whether the comments are actually landing.

post_jira_update
write

Post a comment to a linked Jira issue. The only thing the connector can change.

A URL, and nothing else

No client id, no secret, no API key to generate and store somewhere. Claude's dialog only takes a URL, so the server handles the rest of the handshake itself.

1

Open Claude's connector dialog

In Claude, go to Settings → Connectors → Add custom connector.

2

Name it and paste the URL

Call it PPC TNT, and for the remote MCP server URL enter https://betterads-production.up.railway.app/mcp

3

Leave the client id and secret blank

The server registers Claude automatically. If the fields are optional in your version of the dialog, skip them.

4

Click Add, then Connect

A PPC TNT approval screen opens. Sign in if you need to, choose the permissions, and click Allow. That's the whole setup — there is nothing to configure on the PPC TNT side.

Two scopes, one of them optional

Both are offered on the approval screen with read pre-checked. Uncheck the other for a strictly read-only connector.

ScopeWhat it allows
readEvery reporting tool — accounts, performance, setup audit, activity, records, Jira links. Eight of the nine.
write:jirapost_jira_update only: a comment on a Jira issue already linked to that account. Nothing else in PPC TNT can be written through the connector.

And it only ever sees what you see. Scope comes from your own PPC TNT access, using the same rules as the app:

If you areThe connector sees
Agency owner or billing memberEvery client workspace under that agency.
Another agency memberOnly the workspaces you've been explicitly granted.
A solo operatorThe workspaces you own.

Built to be revocable

A connector that reads every client's numbers deserves more than an API key in a text field. Here is what actually protects it.

🔑

Your password is never involved

Consent happens on a PPC TNT screen where your existing session already lives, so the connector never touches a password and there's still exactly one login screen.

🔄

Access is re-checked every time

Your reach is resolved from the database on every request rather than baked into the token. Remove someone from an agency and their connector loses that account on the next question.

🔐

Nothing reusable is stored

Authorization codes and tokens are kept only as SHA-256 hashes. Codes are single-use, and a replay attempt revokes everything already issued to that client.

🚧

Reads are an allow list

query_records is not a query language. Tables, columns and operators are declared up front and the workspace filter is applied server-side — never taken from the request.

✍️

One write, gated

Posting to Jira has its own scope, asks you to confirm, and is restricted to issues already linked to that account.

🧯

Small blast radius

Connector tokens aren't your app session. They're scoped to the connector surface, independently revocable, and can't be replayed against the rest of the API.

See the portfolio, not the page

Paste one URL into Claude and ask which clients need you today.

Read the setup guide → Sign in