Why Cross-App Matters
Consider a typical enterprise workflow: “Check if Acme Corp’s invoice is paid, update their CRM record, and notify their account manager.” This touches three systems: ERP, CRM, and email. In a traditional setup, you’d need to:- Build an integration between ERP and CRM
- Build an integration between CRM and email
- Write orchestration logic to coordinate the workflow
- Handle errors, retries, and edge cases
The Technical Challenge
Making tools from different applications available to a single agent is harder than it sounds. Authentication fragmentation. Each application has its own authentication. Your CRM session is different from your ERP session. An agent that wants to call both needs credentials for both. Context boundaries. Traditional web security isolates applications from each other. JavaScript in your CRM can’t call APIs in your ERP—same-origin policy prevents it. This isolation is intentional and important for security. Discovery. The agent needs to know what tools exist across all applications. If tools are defined per-application, there’s no unified view. Most solutions to these problems involve building a server-side proxy. The proxy has service accounts for each application, routes requests between them, and provides a unified tool surface. This works but introduces:- Credential management. Service account tokens need to be stored, refreshed, and rotated.
- Over-privileged access. Service accounts typically have broader permissions than individual users.
- Complex deployment. The proxy becomes critical infrastructure requiring high availability.
- Audit challenges. Actions appear to come from the service account, not the user who initiated them.
Why Browser-Based Execution
When you’re logged into an application in your browser, you already have an authenticated session. That session represents your identity, your permissions, your access. The session exists—no additional credentials needed. Char’s insight is that the browser can be the execution environment. Instead of a proxy with service accounts, tools execute directly in your browser tabs using your existing sessions. When the agent callserp.lookupInvoice, the request routes through the Tool Hub to your ERP tab, which executes it using your ERP session. The API call happens in the browser, uses your cookies, respects your permissions.
This means:
No credential storage. Char doesn’t have your ERP password or API token. The browser has your session; that’s enough.
Permission parity. The agent can only do what you can do. If you can’t delete invoices, neither can the agent.
Proper attribution. Your application’s audit logs show your user ID, not a service account.
Instant revocation. When you log out or your session expires, the agent loses access. No tokens to revoke separately.
The Execution Flow
When an agent invokes a cross-app tool, the request traverses several boundaries: Key points:- The Hub routes, doesn’t execute. The Hub never sees the actual API request or response body. It only knows “tool X was called” and passes opaque messages.
-
postMessage bridges contexts. The Char agent runs in an iframe with its own origin. Communication with the host page uses
postMessage, the standard cross-origin messaging API. - fetch() uses the session. When the host page calls the application’s API, the browser automatically attaches session cookies. No code needed to “pass” credentials.
- Same-origin policy applies normally. The host page can only call APIs it could normally reach. Cross-origin requests require CORS headers just like any other JavaScript.
Tool Namespacing
When multiple applications register tools, name collisions are inevitable. Your CRM might have asearch tool. Your ERP might also have a search tool. These do different things.
The Hub automatically namespaces tools by their source domain:
| Source Domain | Tool Name | In Registry |
|---|---|---|
| crm.company.com | search | crm.search |
| erp.company.com | search | erp.search |
| docs.company.com | search | docs.search |
crm.search, not erp.search.

