Skip to content
Action plane · Tool Gateway

Connect to enterprise systems through one Gateway

Every adapter is brokered through the Tool Gateway: typed envelopes, declared approval_mode, idempotency on writes, identity propagation, OTEL traces.

MCP / A2A / OpenAPI / custom — one envelope shape, one policy boundary.

Abstract ContextOS Tool Gateway visual showing typed envelopes, approval gates, identity rails, trace rails, and enterprise adapters.
Action-plane gateway

Adapters stay behind one Tool Gateway, where approval modes, identities, idempotency keys, evidence capture, and traces are bound before effects reach external systems.

Tool GatewayAdapter registryApproval modeIdentityTraceEvidence
Before any tool call
  1. 01Discover capability

    Resolve the adapter from intent, not a raw catalog dump.

  2. 02Bind approval

    Apply the highest allowed approval mode for the request.

  3. 03Propagate identity

    Carry user delegation and workload identity into the call.

  4. 04Protect writes

    Attach idempotency, retry, and circuit-breaker controls.

  5. 05Record evidence

    Return tool results with policy, trace, and evidence refs.

PostgreSQL

Database
read_only
Featured
v1.2.0

Snowflake

Warehouse
read_only
v1.2.0

Salesforce

CRM
delegated
Featured
v1.2.0

HubSpot

CRM
delegated
v1.2.0

Linear

Issue Tracker
local_write
Featured
v1.2.0

Jira

Issue Tracker
local_write
v1.2.0

Slack

Communication
delegated
Featured
v1.2.0

Notion

Knowledge Base
local_write
v1.2.0
Approval-mode binding

Every capability declares its highest approval mode

Adapters declare what they can do. The Tool Gateway decides whether the call happens, on whose behalf, with which credentials, and what evidence the result must produce. Policy may select a lower effective mode for a bounded request when the declared maximum allows it, but cannot exceed that maximum.

See the Adapter Mesh foundation and the approval-mode tier taxonomy.

adapter capability declaration (excerpt)
adapter_id: adp_payments
type: OPENAPI
approval_mode: destructive
capabilities:
  - name: issue_refund
    input_schema:
      properties:
        order_id: { type: string }
        amount_inr: { type: number, max: 50000 }
        idempotency_key:
          type: string
          pattern: "^ik_[a-z0-9]{16}$"
        required: [order_id, amount_inr, idempotency_key]
permissions:
  - role: support_agent
    arg_constraints: { amount_inr: { max: 500 } }