one connection · 21 services · tool calls never billed

330 tools in. About 20 in the menu. Every one still callable.

Real MCP clients cap the tool list. Claude's stack keeps the alphabetically-first 256 tools from a single MCP server and silently drops the rest — no error, no warning. The hub serves each server as one action-parameterised gateway tool, so the menu stays small and nothing behind it is lost.

Part of Parsons · $15/mo · pay yearly and two months are free · 14-day free trial, cancel any time.
your client · tools/listdirect · 330 wired in
auth · list_users
auth · whoami
crm · create_deal
crm · list_contacts
database · execute
database · query
deploy · create_app
domains · register_domain
email · list_mailboxes
journal · add_entry
money · transactions
client cap · 256
scheduler · create_schedule
social · list_posts
storage · presign_upload
tracker · create_tasks
silently dropped — kept in alphabetical order, truncated at 256
with the hub · domain serving21 definitions
parsons_ai_gatewayparsons_assistantsparsons_authparsons_billingparsons_crmparsons_databaseparsons_deployparsons_domainsparsons_emailparsons_journalparsons_moneyparsons_schedulerparsons_socialparsons_storageparsons_tracker+ 6 more
nothing truncatedevery granted action still reachable
The pain, named

The same server, configured three times.

Claude Desktop wants one shape. Cursor wants another. VS Code wants a third. You paste the same token into all of them, on both machines, and then a client quietly stops showing half your tools. Restarting does not fix it, because it is not a glitch — the client is cutting the list to a fixed size, in alphabetical order, every single time. Nothing errors. That is why it is so hard to name.

claude_desktop_config.json
"mcpServers": { "github": {
  "command": "npx",
  "args": ["-y", "…"], "env": { "GITHUB_TOKEN": "ghp_••••••••••" } } }
.cursor/mcp.json
{ "github": {
  "type": "stdio",
  "command": "github-mcp", "env": { "GITHUB_TOKEN": "ghp_••••••••••" } } }
settings.json — VS Code
"mcp.servers": { "github": {
  "transport": "stdio",
  "cwd": "~/tools", "env": { "GITHUB_TOKEN": "ghp_••••••••••" } } }
1 secret3 files2 machines0 places to revoke it at once
what the hub served
330 tools
Every grant joined to a complete tool index. The hub sends the whole menu in one un-paginated response — no cap anywhere in its code path.
what the client kept
256 tools
Exactly 256, the same survivors every session. Whole namespaces past the cut vanished — one service was down to 1 tool of 48, two more were gone entirely, and calling them returned “No such tool available.”

The failure is documented publicly against the client, not invented here: pagination on tools/list is ignored, and one server’s list is cut to its alphabetically-first 256 tools.

The turn

You don't build a config. You narrow a menu that already works.

Sign in and the project is already provisioned: two profiles, two live connections, twenty-one first-party services, and the catalog already granted — in full on Admin, and minus the tools that can spend money on Personal. There is no empty state to fill in. The work you do here is taking things away, not wiring things up.

PARSONS · project provisionedat first sign-in
profiles2
· Personaldomain-served · purchase-free
· Admindomain-served · + hub__* tools
platform services21 · all healthy
grantedfull catalog, minus purchases
connections live2
configuration requirednone
$ claude mcp add --transport http parsons <your connection> Get yours →

One connection · minted for you at sign-in. The --transport http flag is not optional — without it the CLI defaults to stdio and tries to execute the URL as a command.

The mechanism

One gateway per server. Unlimited grants behind it.

Instead of publishing 330 tool definitions and hoping your client keeps them, the hub publishes about twenty — one per server, named parsons_crm, parsons_money, parsons_storage. Each carries every action you have granted, as a parameter. The client's cap never gets near it.

The gateway's action list is the grant set — so narrowing the menu and narrowing permission are the same act. An action you have not granted is not in the list and is not callable by name.

If you prefer the flat listing, direct serving is a per-profile switch — and the default for a profile you create yourself — guarded at TOOL_BUDGET = 240 so it can never silently truncate on you. Past the budget the profile is flagged in the console and in show_profile rather than quietly losing tools.

client
calls one tool
gateway tool
parsons_crm
{ action, args }
service
crm
the call
{ "action": "create_deal",
  "args": { "title": "Acme renewal", "value": 4800 } }
what happens
routed through to crm · deal opened in the default business line
✓ resolved at the service
The obvious objection

Hiding the tools doesn't make the model dumber.

It makes it faster to correct. When an argument name is wrong, most stacks let the upstream validator strip it silently and hand back an odd result, and the model guesses again. Here a wrong argument is refused loudly, with the complete schema inline, and the request is never sent.

4round trips · silent strip
1
calls delete_bucket with bucketName — the argument is quietly dropped
2
gets an odd result back, guesses name instead
3
discovers it needs confirm: true, adds it
4
discovers bucket is an id, not a display name — finally succeeds

This is not hypothetical. It is what PLAT-72 actually cost on one delete_bucket, and it is why the guard exists.

1round trip · loud refusal
1
calls delete_bucket with bucketName — refused before anything is sent
Unrecognized argument "bucketName". Valid arguments: bucket, confirm, force. The request was NOT sent — fix the call against this full argument schema and re-send it in one go (no need to call describe): { "bucket": { "description": "the bucket ID from list_buckets, NOT the display name" }, "confirm": { "type": "boolean" }, "force": { "type": "boolean", "default": false } }
2
re-sends once, correct on every field at the same time
Deny by default

A tool you didn't grant isn't hidden. It isn't there.

No grant row means the tool is absent from tools/list and refused if the model calls it by name. Flip a switch and the change lands in an open session — the hub pushes tools/list_changed to every live session on that profile, so nobody has to reconnect.

console · profile toolsjournal
add_entrywrite
recent_entriesread
search_entriesread
on_this_dayread
delete_entrydestructive

The read / write / destructive tags come from the console itself. A tool's name is not its behaviour — which is why the grid shows what each one does, not only what it is called.

your client · tools/list4 actions
parsons_journal · add_entry
parsons_journal · recent_entries
parsons_journal · search_entries
parsons_journal · on_this_day
tools/list_changed · pushed to the open session

Turn delete_entry on and it appears here without a reconnect. Turn it off and calling it by name comes back refused, not empty.

Structural, not policy

Two things sit outside the switchboard.

Every product tool has a switch. Exactly two things do not, and neither is a rule somebody could later relax — they are shapes in the data model.

A · the management surface
hub__grant_toolno switch column
hub__add_memberno switch column
hub__set_member_capno switch column
hub__revoke_toolno switch column

These are never written into the tool index, so the grants table has no row that could point at them. A managed profile cannot be given "change permissions" even by mistake. They live on a separate admin mount that requires the admin scope, and every mutation re-verifies project ownership against auth.

B · purchase-free by design
spends_money · domains · register_domain
Personal profilethe connection your everyday AI gets at sign-in
register_domain can spend real money, and the Personal profile is purchase-free by design — grant it on the Admin profile or a custom profile instead

Every grant door funnels through one check, so the refusal lives in one place — and it names where the tool does belong instead of failing silently.

There is no "dangerous tool" blocklist here, because a blocklist is a list somebody forgot to update. Money, for one, has no transfer tool at all — so there is nothing to withhold.

Your own servers

Register any remote MCP server.

Three auth shapes, all shipped, no cap on how many. The hub holds the credential encrypted, discovers the server's tools on success, and re-checks health every hour. Your AI never sees a secret.

Openpublic endpoint
hub__register_external_server
{ slug, name, url }

Nothing else needed. Point it at a public HTTPS Streamable-HTTP endpoint and its tools appear in your grant grid, alongside the twenty-one first-party ones, granted the same way.

tools re-listed on the hourly health sweep, and again whenever you update the server
API keyheader auth
hub__register_external_server
{ slug, name, url, headerValue,
  headerName? }

headerName defaults to Authorization. Rotate it later with hub__update_external_server and the tool list is re-discovered.

🔒AES-GCM at rest · the hub attaches it, your AI never receives it
Per-user OAuthGitHub · Notion · Linear
hub__register_oauth_server
{ slug, name, url, scopes }
protected-resource metadata
authorization server discovery
dynamic client registration
PKCE

The hub discovers the provider and registers itself. Each teammate then connects their own account through a link the AI hands back — and can disconnect it with hub__disconnect_account.

remote only
Public HTTPS, Streamable HTTP. Local and stdio servers are not supported — that is a real limit, not an oversight.
private IPs blocked
Checked at registration and again at connect: loopback, link-local, private ranges and cloud metadata addresses are refused.
256 KB
Result size cap, so one chatty upstream tool cannot flood a model's context.
30 s
Request timeout. A hung upstream fails your call, not your session.
Confused deputy, answered

The token you arrive with never travels upstream.

The hub does not issue tokens — auth.parsons.ai does, and the hub is an OAuth 2.1 resource server that validates them. When it calls a third-party server on your behalf it presents your own stored token for that server, and nothing else.

you
your MCP client
auth.parsons.ai
issues the token
mcp hub
validates, never mints
your Parsons token
your stored GitHub token ✓
github mcp
the upstream server
token minted for profile A
aud: …/p/prof_sample_a41f/mcp
presented at: profile A
accepted
the same token, profile B
aud: …/p/prof_sample_a41f/mcp
presented at: profile B
structurally dead here

Audience binding (RFC 8707) means containment is by URL, not by a claim check somebody could misconfigure. Each connection also publishes RFC 9728 protected-resource metadata, so a compliant client discovers where to authenticate from the 401 itself.

The part a permission list can’t do

Give someone six tools and ten dollars.

Role-based access answers may this person call this tool. It has no answer to how much may this person spend. We own the connection, the services and the ledger, so the cap is enforced where the money is — a monthly ceiling, in cents, that bounds everything their usage can charge you: AI tokens, metered usage and purchases alike.

Ssam@example.com
member · claimed 2026-08-14
profilesClient Work · 30 tools
month to date$4.12
$10.00
Everything Sam's usage can charge you this month stops at $10.00. Nothing they do can exceed it.
hub__add_member — called without confirm. Nothing has been sent.
about to share with sam@example.com
profile Client Work · 30 tools
public channels bound to this profile: 1
— a phone line answers on this profile. Granting here publishes a tool to anyone who dials the number.
cancelconfirm: true → send invite
member's own surface
list_team

Who is on the team, what they hold, and who can approve a purchase.

the escalation path
notify_member

Ask the owner to approve an over-budget purchase without ever seeing their contact details. Cap-exempt, because it is how you get unstuck — rate-limited to 10 a day per pair.

Membership is re-verified against auth on every single request — nothing is cached into session state, so removing a member bites on their very next message and their outstanding claim link dies with it. Admin and management profiles are never shareable with a member, structurally.

Blast radius

And when it can't check?

A profile can be the tool boundary for a public phone line — an assistant answers the number, and the assistant's tools are that profile's tools. Granting there publishes a tool to anyone who dials. The hub reads upward through the assistants binding before a grant lands.

Fails visible. "No channels" and "couldn't check" are never collapsed into the reassuring one.

audit log · every management action and every executed tool call
whenactortoolprofileresult
14:02samcrm · create_dealClient Workok
14:01mikehub__grant_toolClient Workok
14:00samcrm · log_activityClient Workok
13:59mikehub__revoke_toolClient Workok
13:52mikehub__set_member_capok
90-day rotation — we keep it for ninety days, not forever

A call the hub refuses is stopped before it reaches a service, so the log is what actually ran, not what was merely attempted. Read it from the console's Activity tab, or ask for it in chat with hub__recent_activity. Health is swept hourly with a confirming retry for platform servers, so an unhealthy connector is a fact in the console rather than a mystery in your client.

Drive it from Claude

One sentence. Five real calls.

The hub administers itself over MCP. Everything on this page — profiles, grants, members, caps, third-party servers — is reachable from the AI you already use, and from the console's own chat if you would rather stay in a browser.

Give Sam the CRM tools except deleting deals, and cap them at ten dollars a month.
01 hub__create_profile applied
{ name: "Client Work" }
→ profile created, with its own endpoint. A profile you make yourself starts in direct serving.
02 hub__update_profile applied
{ profileId: "prof_sample_c7d2", serving: "domain" }
→ switched to gateway serving · one tool per server, parsons_crm
03 hub__grant_server applied
{ profileId: "prof_sample_c7d2", serverId: "crm", except: ["delete_deal", "delete_contact", "delete_company"] }
→ 30 actions granted, 3 held back. All-or-nothing: if a name in except matches no tool, the whole call fails rather than granting more than you meant.
04 hub__add_member preview only — not sent
{ email: "sam@example.com", profileIds: ["prof_sample_c7d2"] }
→ about to share 30 tools and 1 public channel. Re-send with confirm: true to send the invite and get the claim link.
05 hub__set_member_cap applied
{ memberId: "mem_sample_4b90", capCentsMonth: 1000 }
→ $10.00 / month. 0 would be a hard lock.
hub__list_profileshub__show_profilehub__update_profilehub__grant_toolhub__revoke_toolhub__set_server_enabledhub__list_membershub__remove_memberhub__register_oauth_serverhub__list_connectionshub__recent_activityhub__refresh_tools

Aliases and per-profile description overrides are part of hub__grant_tool too — rename a tool, or re-document it for one connection, without touching the upstream server.

Where we win, where we lose

The four rows we lose are the same size as the rest.

A comparison that only flatters the person who wrote it is a sales sheet. Here is the whole board.

what you're checkingParsons MCP Hub
Tool calls charged or cappedNo. Recorded, never billed, no monthly allowance — on every account.
Per-person monthly spend cap, in centsYes — bounds AI, metered usage and purchases
Deny-by-default per-tool grantsYes — no grant row means absent from tools/list
Fits a client that caps at 256 toolsYes — ~21 gateway definitions, unlimited grants behind them
First-party services included21, in the same $15 subscription
Third-party servers, profiles, membersUnlimited — no per-seat charge, and no cap exists in the code
Prebuilt third-party connectorsNone. You bring the server's URL.
Local / stdio MCP serversRemote HTTPS only.
Compliance attestationsNone. No SOC 2, no signed attestation to hand a procurement team.
Self-hosted or open sourceManaged only.
Audit retention90 days, then rotated out
Interactive widgets (ui:// resources)Work for external servers. Platform services cannot serve one yet.

If you need a thousand prebuilt SaaS connectors, a local stdio bridge, or a signed compliance attestation for a procurement review, buy the product that has them. If you need to hand a person an AI with a visible edge on both what it can do and what it can spend, that is the thing we built.

The catch, or the absence of one

The meter is on. It just isn't wired to a price.

Every tool call is recorded and none is billed. There is no monthly allowance to run out of, and there will never be one — the old allowance rows were deleted because they had no reader, sat twenty times below real usage, and would have blocked the very tool a lapsed account needs to resubscribe.

usage · an example heavy month on Base
tool_calls41,203 calls
meteredyes · recorded forever
included allowancenone — there is no limit
ratefree
charged for tool calls$0.00

Our own measured cost is $0.0000133 per call — 1.3¢ per thousand. That is why we can leave it free: the hub is the front door to twenty-one services you are already subscribed to, not the business itself.

Measured real load, for scale: the busiest hour we have seen from one account was 1,069 calls, and the heaviest single day ever was 1,376.

abuse ceiling · account-widesame on every account
100,000 calls / day refills ~70 / minute
A token bucket, not a quota you can exhaust — 73× the heaviest day we have ever recorded. Billing and hub-management tools stay callable even while it is throttling, so a runaway loop can never lock you out of stopping it or paying us.
Its own refusal text: calls resume automatically as the limit refills — it is a safety stop, not a sales lever.

There is a front door pay-gate too, and it has the same shape: if a subscription lapses, subscribe, cancel, wallet and limits tools stay reachable from the agent, so you are never trapped needing a browser you do not have.

Pricing

One plan. It covers everything.

The MCP Hub is not sold on its own. The subscription is the account, and the account is every Parsons product across unlimited projects. Pay monthly, or pay for the year and two of the twelve months are free. No per-seat line, no enterprise tier, no free tier.

Base
$15 / month
or $150 / year — two months free
MCP Hub tool callsunlimited
Remote MCP serversunlimited
Profilesunlimited
Team membersunlimited
  • All 21 first-party services on one connection
  • Per-member monthly spend caps, in cents
  • 90-day audit log across every profile
  • Auth monthly active users — also uncapped
  • Scheduler 20,000 fires · Storage 5 GB · Email 200 sent/day
Start your trial

The hub itself is never the meter — tool calls stay free and uncapped, and the allowances live on the other products. Go past one of those and the overage simply draws from prepaid credits at roughly cost × 1.5: the bill starts when real usage does, not before.

Unlimited projects. At no extra cost.

A project is a hard wall: its own data, its own members, its own spend cap, and its own MCP connection. One per business, one for the side thing, one for personal. The price does not move.

personal
Personal profile
cap $10/mo
acme-storefront
3 members
cap $60/mo
client-work
1 member
cap $25/mo
the-side-thing
solo
cap $12/mo
staging
solo
cap $0/mo
$15/month, total — or $150/year.
Not per project. Not per seat.

Projects cost you organisation, not money — the subscription is the account, and it covers every project on it. Each one gets its own connection, so your client-work AI and your personal AI are not the same AI.

What the same $15 also coversBase allowances, other products
MCP Hubtool calls — uncapped, free
Authmonthly active users — uncapped
Deploy1,000,000 requests · 1 GB app storage
Database1 GB · 100,000,000 rows read
Storage5 GB of objects
Email200 sent/day
Scheduler20,000 fires
Tracker10,000 tasks
CRM50,000 contacts
Notifications200 email messages
Radar100,000 checks
Money2 bank connections
Phone120 voice minutes
Journal2,000 entries
one account · unlimited projects · unlimited members$15.00 / month · or $150.00 / year

Is $15 worth it? Check it against one invoice.

Not against nothing — against the single tool you already pay for, and against the per-seat line that grows every time someone joins.

01 · what one comparable tool costs
HubSpot, Attio and Pipedrive land between $48 and $99 a month for a CRM, and every one of them bills it per seat. Linear starts at $8 a seat. Base is $15 a month, total, for twenty-one first-party services behind one connection. Per app a specialist will sometimes beat us on price; across the set, nothing is close.
02 · nothing here is per seat or per workspace
Unlimited team members, unlimited profiles, unlimited registered MCP servers, unlimited projects — on the same $15. Tools priced per seat bill you again for the fifth teammate, and again for the second workspace. Here the fifth teammate changes the invoice by nothing; they arrive with a spend cap instead.
03 · consumption is prepaid, capped and separate
The things that genuinely cost money — AI tokens at provider cost × 1.5, voice at $0.03/min, a US number at $3.99/mo — are prepaid from a wallet, capped per project and capped per member. The $15 buys access and stays $15 — the wallet is money you put there on purpose, not a line that appears at the end of the month. Tool calls stay free and uncapped inside it.

14-day free trial on your first subscription · cancel any time. The trial is a real subscription, so checkout does collect a card — and there is no free tier waiting behind it.

Questions people actually ask

The awkward ones, answered flatly.

Will this fix my client dropping tools?
That is what it was built for. Instead of publishing hundreds of definitions and hoping your client keeps them, the hub publishes about twenty-one — one gateway tool per server, each carrying every action you granted as a parameter. The client's 256-tool cap never gets near it. See the mechanism.
Which clients does it work with?
Claude, Cursor, VS Code, and any MCP client that speaks Streamable HTTP with OAuth. We deliberately do not list ChatGPT: we have not verified it end to end, and the smallest model we observed failed on tool management. We would rather leave it off the page than have you find out the hard way.
Can I connect my own MCP servers?
Remote ones, yes, unlimited — public HTTPS speaking Streamable HTTP, with open, API-key or per-user OAuth auth. Local and stdio servers, no. Private and loopback addresses are blocked, results cap at 256 KB and requests time out at 30 seconds. See the three doors.
Can I share a profile by sending someone the link?
No — and it is worth being precise, because the internet is full of gateways where you can. Every connection is OAuth-protected; a stranger holding the URL gets 403 profile_not_accessible. Sharing is an invite by email, to specific profiles, with a preview of exactly what you are handing over. See Teams.
Can a teammate spend my money?
Only up to the cap you set, and the cap is a real ceiling on everything their usage charges you — AI, metered usage and purchases. The default is 500 cents — $5.00 a month. Setting it to 0 is a hard lock. Lowering it below their month-to-date spend locks them until the month rolls over, which is the honest behaviour and we would rather print it than hide it.
What happens if I hit the abuse ceiling?
You are refused, and the refusal does not try to sell you anything: the ceiling is the same on every account and exists as a safety stop, with an "ask us to raise it" path in the billing console. Calls resume as the bucket refills at about 70 a minute, and billing plus hub-management tools stay callable throughout so you can stop the runaway job. See the bucket.
How long do you keep the audit log?
90 days, then it rotates out. Every management action and every executed tool call is a row, with the actor, the tool, the profile and the result.
Do you have SOC 2?
No. No SOC 2, no HIPAA, no signed attestation to hand a procurement team. If that is a hard requirement for you, we are not the right product yet and you should know that before you sign up rather than after.
Is there a free tier?
No. There is a 14-day free trial on your first subscription, then $15/mo — or $150 for the year. The trial is a real subscription so checkout collects a card, and cancelling and resubscribing does not start a second trial.
Is there an annual plan?
Yes. The subscription is $15/mo or $150/yr. Paying for the year costs exactly two months less than paying monthly — $150 against $180. You choose the interval at checkout, and the 14-day trial applies to your first subscription either way.
How many projects can I have?
As many as you like, at no extra cost. Each is a hard wall with its own data, members, spend cap and MCP connection — and as the owner you can connect any of your projects' connections regardless of which one was active when you signed in. See the grid.

A small menu. Nothing missing behind it.

One connection, minted for you at sign-in — with a switch on every tool and a dollar cap on every person you hand it to.

$15/mo or $150/yr · 14-day free trial, cancel any time.