Skip to content

Headless JUWEL

Chat, tools and the CLI bridge, reachable from your own tools.

One scoped key per caller. Service accounts, branches and metered billing are direction, not features. The reference lives on juwel.ai.

Same core, many doors

One core. Four doors.

One core. Four doors.JUWEL core with four doors: the browser app, the MCP endpoint, direct tool calls and the CLI bridge. The browser app is live; the other three are documented and answering. An SDK, a CLI package and MCP OAuth are drawn dashed because they are coming.JUWEL coreone scoped key per callerBrowser appMCPPOST /api/mcpTool calls/api/toolsCLI bridge/api/cli/chatSDKCOMINGCLI packageCOMINGMCP OAuthCOMINGOne core. Four doors.JUWEL core with four doors: the browser app, the MCP endpoint, direct tool calls and the CLI bridge. The browser app is live; the other three are documented and answering. An SDK, a CLI package and MCP OAuth are drawn dashed because they are coming.JUWEL coreone scoped key per callerBrowser appMCP/api/mcpTool calls/api/toolsCLI bridge/api/cli/chatSDKCOMINGCLI packageCOMINGMCP OAuthCOMING
Solid is documented and answering. Dashed is coming, not live.

Who calls, who approves, what is logged

Who calls, who approves, what is logged
DoorWho callsWho approvesWhat is logged
BrowserYou, in the JUWEL appYou, on the approval cardYour chat history
MCPAn MCP client with a jak_ keyA person, for the gated setEach call, against the key
Tool callsYour code with a jak_ keyA person, for the gated setEach call, against the key
CLI bridgeA terminal with a jak_ keyA person, for the gated setEach call, against the key

Copied from the reference

Three calls you can run.

{
  "mcpServers": {
    "juwel": {
      "url": "https://juwel.ai/api/mcp",
      "headers": { "Authorization": "Bearer jak_..." }
    }
  }
}
# approve with your own session (or a device-kind key), never the agent key
curl -X POST https://juwel.ai/api/tools?action=approve \
  -b "session cookie" -H "Content-Type: application/json" \
  -d '{"tool":"gcal_create","args":{...}}'   # -> {nonce}
# pass it back in the MCP call as params._meta.approval
export JUWEL_AGENT_KEY="jak_..."

curl -N -X POST https://juwel.ai/api/cli/chat \
  -H "Authorization: Bearer $JUWEL_AGENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"summarize my last run"}],
       "tools":[], "surface":"vps", "profile":"default"}'
Documented and answering: a GET to each endpoint returns 405. A person has not yet run this journey on production. The CLI bridge stream is new, so treat long streams as fresh.

Keys and scopes

  1. Requested scopes only.

    A key gets exactly the scopes you ask for. Nothing is granted on its own.

  2. Shown once, revocable.

    The token appears once, when you mint it. Revoke it and it stops working at once.

  3. Every call logged.

    The activity log shows what an agent did through your grants.

What we do not claim

We do not claim a key cannot escalate until the listed residual risks are closed.

Today and next

Today and next
StatusWhatDateSource
LiveAn AG-UI endpoint answers (POST /api/ag-ui). Native chat on it is not yet verified.
ComingSDK and CLI packages under the JUWEL name. Not on npm yet.
ComingMCP OAuth. Today MCP auth is a scoped bearer key.

Common questions

Short answers.

Which door should my agent use?

All three share one approval flow, so pick the one your tools already speak: an MCP client uses the MCP endpoint, code uses direct tool calls, and a terminal uses the CLI bridge.

Do I need OAuth?

Not today. MCP auth is a scoped bearer key. The MCP authorization flow is in review.

What gets logged?

Each call a key makes is logged against that key, and you can read the log from the same account.

Where is the reference?

On juwel.ai/developers, and as plain text at juwel.ai/developers.md.

Read the reference on juwel.ai.

The endpoints, the scopes and the approval flow, in one place.