auto. Free stays on that default. Pro and Enterprise Settings can show a pinned mode if one was set earlier, with a way to switch back to auto.
The three tiers
Flat
Every permitted tool is defined up front. Best experience with no indirection, for small setups.
Apps
One meta-tool per app, named for the app (for example
github, supabase). The tool list itself is the readable
inventory; each app’s tool definitions load on demand inside its meta-tool.Compact
Two global meta-tools (a search and a call) whose descriptions carry the app manifest. For very large fleets.
How auto chooses
When the mode isauto, the workspace endpoint estimates the serialized tool-definition tokens for the caller and compares that estimate with the discovery token budget. The default budget is 4,096 estimated tokens. This is an approximate selection target for the initial definitions; it excludes server instructions and future tool results, and compact mode can still exceed a very small configured budget because its two meta-tools must remain usable. A separate tool-count threshold (default 40) prevents a small catalog from taking the indirection cost of a wrapper.
1
Flat for a small budget fit
If the permitted tool count is at or below the threshold and the estimated flat definitions fit the budget, the
gateway serves flat.
2
Apps for a larger budget fit
If flat is too large but one wrapper per app fits the budget, the gateway serves apps. Apps mode supports up to
24 permitted apps.
3
Compact when wrappers do not fit
If the app wrappers do not fit, or more than 24 apps are permitted, the gateway serves the two global search and
call meta-tools.
auto, change the threshold from 1 to 500, and set the token budget from 512 to 32,768 when they need a fixed presentation. Day-to-day Free workspaces do not expose that control and remain on auto.
Auto only applies to the workspace endpoint (
/mcp and /w/{workspace}/mcp). A per-app endpoint (/s/{appKey}/mcp)
and a bundle endpoint (/b/{bundleKey}/mcp) are already curated slices, so they always stay flat regardless of this
setting.Why the inventory always stays visible
Hiding the inventory would make an agent capability-blind. It would answer “I don’t have GitHub” on agents that never proactively search. So at every tier the list of apps a person can reach stays readable. Inapps mode the tool list is that inventory. In compact mode the meta-tool descriptions carry it. Only the detailed per-tool definitions load on demand, which is what keeps the context cost down.
The repeatable context-efficiency benchmark measures the definition, task-context, wire, result, CLI-process, and latency costs of automatic, flat, apps, compact MCP, and Passport CLI against the same deterministic governed task.
Brief search and exact schemas
Broad discovery is deliberately brief.passport_search_tools returns at most three brief matches by default and never includes parameter schemas in those hits; callers can request up to ten. An app wrapper behaves the same way with {find:"keywords"}. A global search with no query returns a bounded app index with counts; it does not return every tool name. In apps mode, {} on one app wrapper returns that app’s complete permitted tool-name catalog.
After choosing a name, fetch one schema with {tool:"github_search_issues",detail:"full"} or an exact query with {query:"github_search_issues",detail:"full"}. In apps mode, use {describe:"github_search_issues"}. The exact response contains the parameters for that one permitted tool. CLI search keeps its compatibility defaults and returns full definitions. Search results are subsets of the permitted catalog, so a broad query with no hit is a reason to refine the query or request an exact name.
Selective output
Result selection is optional and controls what the agent receives after a provider call. It uses bounded RFC 6901 JSON Pointer paths. For compactpassport_call and app wrappers, pass output beside the provider args:
_passport_output argument when the upstream schema does not already use that name. itemPath identifies the array to page; if it is omitted, the JSON root is the item list. fields projects each selected object, where applies scalar equality, offset pages from zero, and limit is capped at 100.
Passport runs its normal result safety checks before shaping and checks the selected result again. Successful shaping adds bounded _passportOutput metadata, including counts, pagination, and omittedFieldCount, which counts requested field pointers absent from the selected objects. offset slices the provider response for this call; Passport does not cache a snapshot or provider cursor. To retrieve another page, make a new read call; do not repeat a completed write just to change its output selection. For text-only JSON, the selected value is also exposed in a structured {data: ...,_passportOutput: ...} envelope; structured provider results keep their existing root with the metadata added. If the content cannot be safely shaped, the original successful result is kept and the response says that selection was not applied.