Share from your terminal

Let Claude Code, Codex, or Cursor read and post in your workspace as you.

The other direction of the MCP connection: instead of an agent joining hilos, your own coding session joins your workspace as you. Claude Code, Codex, Cursor, or anything else that speaks MCP can read the channels you can read and post the way you would.

Once it's connected, you can say things like "share this in #general", "grab the context from the design channel before we start", or "reply in that thread," and you can paste it a hilos message link and it will go read the discussion around it. Anything it posts appears as you: your avatar, your name, and a small "via Claude Code" marker next to the timestamp.

It works in both directions. Your session can also ask "what's addressed to me?" — list_mentions returns your @-mentions, broadcasts, and DM messages, decided by the same rule as the app's notifications, and it can hold the request open (waitMs) so a session you leave running is told the moment something arrives. Nothing is pushed uninvited: your client polls, and the get_wake_channel doorbell only says "worth polling now." Artifact work moves both ways too: your agent can list an approved handoff, carry it to the provider, and report the result by calling hilos tools.

If you want a teammate's hilos reply to continue the same local Codex, Claude Code, or Cursor session as an agent, connect an owned agent identity such as Pabs Codex and install the local reply bridge in Connect your own agent. That keeps the agent squircle and the person's avatar honest about who is speaking.

Get a token

In hilos, open Settings → Connections → Coding-agent connections and create a named connection. The personal token is shown once, stored only as a hash, and posts as you — treat it like a password. You can keep separate Codex, Claude, and automation connections, see when each was used, narrow admin access, and revoke one without disrupting the others. Leaving the workspace or losing a role takes effect on the next call.

  • Endpoint: https://hilos.sh/api/mcp
  • Auth: Authorization: Bearer hpt_… on every request
  • Client label: x-hilos-client: claude-code (or codex, cursor). This is what the marker on your messages reads from

Claude Code

Install the plugin from the public pablostanley/hilos-agents repository. Inside Claude Code, run /plugin marketplace add pablostanley/hilos-agents then /plugin install hilos@hilos. Paste the token shown on the hilos page into hilos personal token and save the configuration. Use /plugin configure hilos@hilos to replace it later.

From a shell, use this block instead (verified with Claude Code 2.1.263):

export HILOS_MCP_TOKEN="hpt_..."
claude plugin marketplace add pablostanley/hilos-agents
claude plugin install hilos@hilos --config hilos_mcp_token="$HILOS_MCP_TOKEN"

The shell installer does not prompt, even in a terminal. --config saves the same sensitive option the slash command asks for. The export supplies it for this install; it does not belong in your shell profile. Once saved, you can unset HILOS_MCP_TOKEN and restart Claude Code, including the desktop Code tab.

Claude Code masks the prompt and stores the value in macOS Keychain, with a credentials-file fallback when Keychain is unavailable. On other platforms it uses its credentials file. The token is not written to settings.json. If the installer says --config not applied, run /plugin configure hilos@hilos and save it before continuing. A successful install message alone does not confirm that the token was saved.

For older clients without --config, update Claude Code or use the direct MCP command below. Manual hooks install --claude --personal still reads HILOS_MCP_TOKEN from the shell that starts Claude Code; keep that export in your shell profile if you use manual hooks. Codex and Cursor keep their existing token setup.

Upgrading from a plugin that used only the environment token? Run /plugin configure hilos@hilos once after updating, or rerun the shell install block above with your token.

The plugin brings the MCP server with it, so there is nothing else to register. It also adds three commands — /hilos-room to see who is in a room and what they are working on, /hilos-share to put something from this session into a room, and /hilos-handoff to hand the work to a teammate or an agent.

Claude Code checks the marketplace once per session. When a new version of the plugin is published, claude plugin update hilos@hilos (or /plugin update) brings it in; the seat and the gestures keep working on the old one meanwhile.

And it gives the session a seat while the session is open. Open a checkout whose GitHub origin is linked to a room you can read, and within thirty seconds your team sees "Pablo's Claude Code, hilos" at the table, before any post. If the repo is linked to several rooms in your workspace, the seat appears in each. Without a linked origin, it appears after you post into a room. Close the tool and the seat is gone within ninety seconds. HILOS_HOOKS=off pauses it without uninstalling anything.

<a id="sessions"></a>

If you would rather register the server by hand — no plugin, no seat — one line does it:

claude mcp add --scope user --transport http hilos "https://hilos.sh/api/mcp" \
  --header "Authorization: Bearer hpt_..." \
  --header "x-hilos-client: claude-code"

Or the equivalent block in ~/.claude.json:

{
  "mcpServers": {
    "hilos": {
      "type": "http",
      "url": "https://hilos.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer hpt_…",
        "x-hilos-client": "claude-code"
      }
    }
  }
}

Codex

Codex reads the token from an environment variable. Export it, then register the server:

export HILOS_MCP_TOKEN="hpt_..."
codex mcp add hilos --url https://hilos.sh/api/mcp --bearer-token-env-var HILOS_MCP_TOKEN

That writes the block below to ~/.codex/config.toml. Add the http_headers line so your messages read "via Codex" instead of the generic marker:

[mcp_servers.hilos]
url = "https://hilos.sh/api/mcp"
bearer_token_env_var = "HILOS_MCP_TOKEN"
http_headers = { "x-hilos-client" = "codex" }

Keep HILOS_MCP_TOKEN exported in the shell you run codex from (your shell profile is the usual place).

You can install the hilos hooks and skills with one command:

npx hilos-agent hooks install --codex

It writes the [mcp_servers.hilos] block above when you do not already have one, installs the three gestures as skills in ~/.codex/skills/, and gives the session a seat when the hooks are trusted and HILOS_MCP_TOKEN is available to the Codex process. After installing or updating, open /hooks and review the hilos entry.

Cursor

Cursor, both the editor and the cursor-agent CLI, reads .cursor/mcp.json in your project folder, or ~/.cursor/mcp.json to make it available everywhere:

{
  "mcpServers": {
    "hilos": {
      "url": "https://hilos.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer hpt_…",
        "x-hilos-client": "cursor"
      }
    }
  }
}

Approve the hilos server with cursor-agent mcp enable hilos. Scripted runs have no prompt to click, so pass --approve-mcps and allow the tools in .cursor/cli.json:

{ "permissions": { "allow": ["Mcp(hilos:*)"], "deny": [] } }

Cursor has neither plugins nor skills, so the three gestures arrive as a rule:

npx hilos-agent hooks install --cursor

That writes .cursor/rules/hilos.mdc (or the same file under ~/.cursor with --global) and gives the session its seat.

Any other MCP client works too, as long as it can register a remote server with a URL and custom headers.

Skills for any agent

The three gestures are also plain agent skills, so an agent without a plugin format can still learn them. One command installs them for Codex, Cursor, OpenCode, or Claude Code, from the same public repository the plugin comes from:

npx skills add pablostanley/hilos-agents

Pick the agents when it asks, or name them: -a codex, -a cursor, -a opencode, -a claude-code. Skills teach the agent how to use hilos; they do not connect it. The MCP server above, registered with your token, is what connects, and without it the skills say so instead of pretending.

Desktop apps

The Claude Code desktop app's Code tab reads the same ~/.claude settings as the terminal — the same MCP servers, the same hooks, the same plugins — so a plugin you installed once works in both. Verified on this Mac against Claude 1.46388.4, which keeps plugin state in ~/.claude/plugins/.

The Codex desktop app discovers the hooks written by hooks install --codex. Verified against app 26.901.41600 and its bundled runtime 0.153.4: all five hilos hooks were listed without parsing errors. Updating the hook command requires reviewing its trust again.

The app process also needs HILOS_MCP_TOKEN. Exporting it in a terminal does not give it to an app that is already running. Hook discovery is verified; a fresh desktop session taking and releasing a room seat is still unverified.

"Open in Claude Code" from a card is waiting on a documented URL scheme. Until there is one, open the room in the app and paste the message link.

What it can do

ToolWhat it does
list_capabilitiesReturns the complete machine-readable command inventory, schemas, roles, scopes, risk, audit target, transport support, and browser-only exceptions
whoamiConfirms who the token acts for and in which workspace
list_mentionsWhat's addressed to you — mentions, broadcasts, DMs — with a since cursor and an optional 25s long-poll
get_wake_channelA content-free Realtime doorbell that says "poll now" the moment anything is posted
list_channelsLists the channels you can see, including your DMs
read_channelReads the newest window of messages from one of those channels; hasMore/cursor page older, and fan-out cards include a content-free manager/specialist runGraph when the room has no guest
get_threadReads a thread root and the newest window of its replies; hasMore/cursor page older, and threaded fan-out cards carry the same guest-safe runGraph
read_message_linkResolves any hilos message link you paste, with its surrounding context
search_messagesSearches messages across the channels you can access
list_membersLists the people and agents in a channel
list_room_rosterSays who is in one room right now, what each agent is working on, and which of the room's open tasks are assigned to whom
attach_sessionTakes a seat in the room for this coding session, so the room can see it is open. Pass repositoryUrl (a normalized GitHub origin URL) to appear in every linked room you can read in this workspace before posting. The label names the repo, never a path
heartbeat_sessionSays the session is still open, and optionally what it is doing. A seat with no heartbeat for ninety seconds reads offline
bind_session_threadRecords that this session posted into a thread, so a reply there can be addressed back to it
detach_sessionThe tool closed: takes the seat away now, instead of waiting for it to go quiet
get_room_limitsHow many runs a room may have going at once, against how many are going now
list_runsThe runs in one room with their branches and pull requests, each one's advisory file claims, and the live runs whose claims overlap them
get_linksShows the repos and links connected to a channel
list_native_artifactsLists the hilos-native mini apps linked to one room, with revision and preview status but no source bundle
get_native_artifactReads one linked mini app's sanitized revision history and preview metadata
set_site_addressMoves a published mini app to a new available *.hilos.space address
read_run_eventsReplays one run's ordered, redacted harness events after a sequence cursor; useful for understanding a sibling agent without scraping chat
list_room_resourcesLists the exact Figma, Framer, Paper, Lovable, Notion, Linear, Google, and Vercel resources attached to a room
read_room_resourceReads one attached resource through the workspace connection, or returns the exact personal-agent handoff for Paper or Lovable, with its canonical citation
attach_room_resourceNormalizes one exact resource. Connected providers are access-checked immediately; Paper and Lovable require the personal-agent attestation returned by the tool
remove_room_resourceRemoves the room link without changing the provider object; open reviews become stale and an in-progress apply needs reconciliation
create_artifact_proposalStages a bounded review card for an attached resource without changing the live artifact
list_artifact_proposalsLists proposals you created and approved personal-agent work delegated to you in one room
get_artifact_proposalReads a proposal you created or an approved handoff, including its decision, lock version, provider payload, and receipt
claim_artifact_proposalAtomically claims an approved proposal before your bot writes to the provider
settle_artifact_proposalRecords the provider result as applied, failed, or stale
create_artifact_originStages a review card for creating one new provider resource; it does not call the provider
list_artifact_originsLists new-resource review intents in an accessible room
get_artifact_originReads the authoritative, secret-free state of one creation intent
revise_artifact_originRevises a changes-requested creation plan and returns it to review without calling the provider
claim_artifact_originClaims the one-shot creation lease after approval, or returns the named-person handoff for Paper and Framer
settle_artifact_originRecords a claimed creation as created, failed with no provider effect, or outcome unknown
reconcile_artifact_originResolves an outcome-unknown creation from provider evidence without repeating the create mutation
framer_statusReads the exact attached Framer project's current state
framer_agentEdits a fresh isolated Framer branch from main through the workspace connector
framer_propose_branchVerifies a Framer branch and stages its native preview and change list for room review
framer_apply_proposalRechecks and merges a Framer proposal created by your personal agent after approval; it never publishes the site
post_messagePosts as you. @-mention people or agents, and PR links unfurl
edit_messageEdits one of your own messages
ask_agentAsks one of the workspace's agents for something as you — to answer it, to look at a piece of work, or to take it over
propose_planProposes up to eight rows of work as one plan card in a room; every row waits for a person's approval before anything runs
list_docsLists workspace docs and folders you can read
read_docReads a doc by id or title
search_docsSearches doc titles and bodies
write_docCreates or updates a doc as you; repo-bound rules changes return a pull request
create_folderCreates a folder in the workspace docs tree
move_docMoves or reorders a doc or folder in one atomic change
rename_docRenames a non-core doc or folder
delete_docPermanently deletes a non-core doc or folder; workspace owners/admins need workspace:admin and confirm: "delete doc permanently"
get_doc_proposalReads protected-doc proposals visible to you
create_taskCreates a task or epic in the workspace tracker
list_tasksLists and filters tracker items you can see
get_taskReads one task or epic with its full details
update_taskUpdates status, ownership, priority, notes, or pull-request links
delete_taskPermanently deletes a task or epic without deleting its children; workspace owners/admins need workspace:admin and confirm: "delete task permanently"
reorder_taskReorders a task inside its current status column atomically
list_automationsLists a channel's automations and their recent runs
save_automationCreates or updates a channel automation (workspace admins; agent steps still wait for a person's approval)
set_automation_enabledTurns one channel automation on or off (workspace admins; re-enabling never replays the disabled interval)
delete_automationDeletes one channel automation and its run history (workspace admins)
list_envLists a room's environment names, kinds, fingerprints, and last use, never raw values
set_env / delete_envCreates, replaces, or removes a write-only room environment value (workspace admins; requires the teamspace's Zero to one feature)
get_room_budget / set_room_budgetReads or sets a room's monthly hosted-agent credit budget (setting requires a workspace admin)
workspace_status / rebuild_workspaceReads the saved-project status or marks it for reinstall on the next hosted run when Warm workspaces is enabled; otherwise runs start cold (rebuild requires a workspace admin)

This also gives a personal agent a way to carry artifact work in both directions. When the provider supports it and you have connected its official tools, the agent can create or edit there, then attach the exact resource to a hilos room. If someone else proposes a change and you approve it for your personal agent, list_artifact_proposals returns that handoff. The agent reads the proposal, claims the current version, checks the provider state, applies the approved scope through the provider's tool, settles the result, and reports back to the room.

Your session can also hand work to the room rather than doing all of it. Use ask_agent to ask one of the workspace's agents for something by name — it posts as you, so the ask sits in the room where everyone can read it. Use propose_plan when the work splits: give it a line about the ask and up to eight rows, each with a title, an optional brief, and the agent you want on it. hilos writes a task and a cited brief per row and posts one plan card that says "Proposed by you via Claude Code".

The plan does not run. Every row sits pending until a person approves it on the card, and the rows nobody approves never dispatch. Because the card records you as the requester, you can approve your own rows yourself. A row names an agent or nobody — leave the assignee off and hilos routes it. To put work on a person, use create_task.

Native mini apps are simpler: use list_native_artifacts or get_native_artifact for context, then use the ordinary post_message flow to ask a hilos-hosted agent to create or revise one. The same message router decides whether the ask belongs in a native artifact, the connected repository, or a new repository; it asks one compact question only when that target is unclear.

hilos does not pass provider credentials through the personal token. The agent uses the provider access already configured in your terminal. Removing a room attachment removes only the hilos pointer. The Figma file, Lovable project, Notion page, Linear issue, Google file, Paper file, or Framer project stays in its provider. Any open reviews for that link become stale. If an agent was already applying a change, check the live artifact before starting again.

The same connection can also operate the teamspace control plane. Rather than copy a long, changing list into this guide, call list_capabilities before a workflow. It currently includes teamspace create/update/leave/transfer/delete; channel create/update/archive/restore/delete and membership; directory, invitations, links, roles, and removal; own-message deletion, ordinary owned/moderated agent-response retraction, reaction, and pin actions; project addresses, write-only environment values, and room budgets; workspace status and repair; run retry and stop; native-app revision, preview, publishing, and GitHub handoff controls; your custom status (set_status — a standard emoji or a workspace :emoji: token, short text, optional expiry; empty clears it); agent archive/restore/cleanup; delegated Activity; and personal-delegate context privacy, export, publication, and temporary grants. The capability manifest is also the transport contract: only an entry whose transports includes rest has a matching /api/v1/actions/:command endpoint; other personal actions are MCP-only or interactive. Mutation results include their available audit-receipt metadata, but callers must preserve the returned teamspace and room scope rather than infer authority from a command name. The remaining live-call room-binding and cross-teamspace receipt-provenance gaps are tracked in tickets 1215 and 1218.

Paper stays local to the person running the bot. Before creating its proposal, the bot records the open file name, target node IDs, a SHA-256 target snapshot, and an observation summary in providerPayload.paperObservation. The room shows that target before approval. After approval, the bot rechecks the snapshot and settles with the visible Paper outcome receipt; a failed or ambiguous write must be reconciled through a new proposal rather than replayed.

Lovable also stays with the person's bot. It connects to Lovable through OAuth, matches the attached project ID and editor URL, and stages a plan before review. After approval it calls get_project again, claims with that fresh observation, and gets a 10-minute apply deadline. Before that deadline it may use only send_message for files named in the approved plan, then records get_diff, the exact project URL, preview, and new revision. If the deadline passes, the bot records the work as stale and reconciles the project before asking again. This is self-attested evidence from the person's OAuth agent, not a provider-signed receipt. Lovable does not expose an isolated branch or an exact pre-write diff through this MCP path, and hilos does not publish the site for the bot.

Framer can complete the same round trip without weakening its native branch boundary. Every personal framer_agent call creates a fresh isolated branch from main; it cannot continue or mutate a caller-supplied branch. A personal agent may still bring an existing branch back with framer_propose_branch. hilos reads that branch through the workspace connector, creates its preview and semantic change list, waits for room approval, then framer_apply_proposal rechecks and merges the exact branch. Publishing the site remains a separate manual action.

Decide from the terminal

A room waits on people, not on tabs. These make the decisions the room is blocked on without leaving your session, and every one of them is recorded as you, with your name on it.

ToolWhat it does
approve_planApproves every pending row of a plan card, so each one becomes a dispatched run credited to you
cancel_planCancels every pending row of a plan card; rows already running keep running
get_pr_diffReads a pull request's changed files and patch text so you see the work before you decide, and returns the headSha to bind your approval to
decide_reportApproves, requests changes on, or rejects an agent's report card — approving merges an attached pull request, so that path needs a workspace owner or admin
answer_questionAnswers an agent's question card with one of the options it offered, or with your own written answer
decide_permissionAllows once, allows always, or denies a permission an agent is blocked on
create_agentCreates a named agent in the workspace and tells you where to finish connecting it (workspace owners/admins, with workspace:admin scope)

Read the diff first. get_pr_diff returns a headSha; pass it back to decide_report as reviewedSha and an approval binds to the commit you actually read — if someone pushed since, the approval is refused and nothing is recorded.

Agents cannot call any of these. An agent that could approve its own plan or decide its own report would be the whole review gate answering itself. When a plan needs a specialist who does not exist yet, the plan names them and a person creates them.

What still needs the daemon

Presence, sharing, and asks all work with the plugin alone: the seat, the three gestures, and every tool in the table above go straight over MCP.

One thing does not. If a teammate replies in the room and you want this same local session to pick that up and keep going, something has to be listening on your machine — either hilos-agent running beside your tool, or the desktop app's in-process daemon. Without one, the reply is still in the room; you just read it and continue yourself.

What it deliberately can't do

Nothing leaves your terminal unless a tool is called by you, or by your agent because you asked it to. There's no background mirroring of your session, and no transcript sync.

Reads see exactly what you see in the app, no more: the same channels, the same DMs, docs, and tracker items. Your DMs stay yours; the token can't reach a room you're not in. Guests have no Docs or Tasks access in the app, so guest tokens do not get those tools — and the workspace-wide wake doorbell is withheld from guest tokens too, since a guest's app only ever subscribes to their own rooms (their list_mentions still works; they just poll). Admin commands require a manager's current role and a connection that was explicitly created with administration scope. If your role changes or you leave the workspace, the token loses access with you.

Some gestures remain intentionally interactive: GitHub/provider consent, billing checkout, and live camera or microphone participation. They appear in list_capabilities with an interactiveOnly reason instead of vanishing from the contract. Native-artifact version selection, preview restart, publish, and GitHub graduation are in that list too. Direct private-source editing by a personal session, named local agent, or Eve agent is not in this first slice; creation and revision use the hilos-owned runner. Connection secrets, provider keys, hidden private context, and raw request bodies are never returned through the activity trail.

How it shows up for your team

Every message posts as you, with your avatar and your name and a quiet "via Claude Code" marker beside the timestamp. The durable Activity record also names the credential-backed connection, command, target, authority, transport, and result. There's no separate identity and no agent squircle: the person remains the author of record, while the delegated path stays visible.