Skip to main content
Hookie runs a hosted MCP server. Point an AI coding agent (Claude Code, Cursor, or any MCP client) at one URL and it can do, on your behalf, the things you would otherwise do in the console: create endpoints, write routing rules, point events at a destination, read records back, and replay a failed delivery. Nothing is installed and nothing is pasted anywhere. The agent signs in as you, starts out read-only (unless you signed up through it), and you decide in the console what more it may do. You can cut it off again in one click.
Hookie has no chat assistant of its own: you bring your agent. In the console, Connect an agent in the top bar (next to the theme switch and your profile) shows your MCP URL, the Claude connector, and the Claude Code command in one place.
The hookie CLI is the same connection from a terminal instead: the same OAuth flow, the same credential store, and commands generated from the same catalog you see below — so anything an agent can call, you can run by hand.

Connect one

Hookie hosts the MCP server. There is nothing to install; point your agent at:
For Claude Code that is one command; or, in an .mcp.json that you can commit to a repo:
For Claude on the web or desktop, add Hookie as a custom connector: open Settings → Connectors, choose Add custom connector, and paste the URL above. Claude then signs in to Hookie as you, the same way. No credential goes in that file, because there isn’t one to put there. The first request your agent makes is refused with a pointer to Hookie’s authorization server (WorkOS AuthKit, the same place you sign in). The agent registers itself there, opens a sign-in in your browser, and from then on holds a token it refreshes on its own. That is the standard OAuth 2.1 authorization-code flow with PKCE, the same one you would get from any well-behaved MCP client. You do not need a Hookie account first. If you have never signed in to Hookie, sign up on that same page (email code, Google or GitHub): the first time your agent calls Hookie, your account and a Free workspace are set up for you, exactly as a first console sign-in would. Because that agent is how you joined, it starts able to build (create and change endpoints, rules, destinations and the rest), not read-only; administering the workspace still needs the console. Any agent you connect after that starts read-only as usual. Sign in to the console with the same method to change what each agent may do.
For something that runs unattended, such as a CI job or your own backend, with nobody at a browser to sign in, create an API key instead. /mcp accepts it as a bearer token, and its role decides which tools it can call.
For an agent that should have a Hookie account of its own, with no person signing in at all, see Agent self-registration. The agent registers itself on the Free plan and gets an admin API key, and a person can claim the workspace later.

What it may do

Signing in proves who the agent is acting for. What it may do is decided separately, by you, in Settings → Connected agents. A newly connected agent can only read until you grant it more, and the change takes effect on its next call. Access is one level of three, and each includes the one before it. Choose it with Change access beside the agent; the dialog says what each level allows. An agent is never a principal of its own. It acts as you, and its authority is your workspace role narrowed to the scopes you granted; whichever is more restrictive wins. An agent granted hookie:manage by someone with the viewer role is still a viewer.

Three things it can never do

  • Touch billing. Subscribing, cancelling, and changing a card are unreachable at every scope. Those stay decisions a person makes.
  • Change who is in the workspace. Inviting someone, changing a role, removing a member and transferring ownership are refused at every scope. An invite link gives a person access, so only a person in Settings → Members can create one. An agent can read the member list with list_members. See Team members.
  • Destroy data in bulk. There is no tool to delete a project, purge a dataset or close the workspace. An agent manages routing configuration, which is visible and undoable; bulk, irreversible deletion stays in the console, where it has to be typed out. Two tools can remove something for good, and both are marked destructive so your client asks you first: delete_record, which erases a single record by id (for an erasure request, or a secret posted by mistake), and delete_workflow with permanent: true, which deletes one workflow and its run history. Records and deliveries the workflow’s runs produced are kept.
Every action an agent takes is written to your audit log with you as the actor and the agent’s client ID recorded alongside, so “who deleted this endpoint” always has an honest answer.

When an agent is refused

A call above the agent’s level is refused with what to do about it, not a bare “Insufficient role”. The 403 names the scope the call needs and the one the agent holds, and links to Settings → Connected agents opened on that agent:
Over MCP the same sentence comes back as the tool’s error, so the agent can hand you the link. Widening applies to its very next call, with no reconnect. Every agent is shown the full tool list whatever its scope, so a read-only agent can see the write tools; calling one before it is widened gets this refusal. Two refusals carry no link, because widening would not help:
  • code: "insufficient_role" — your own role does not allow the call, and an agent can never do more than you, so widening its access will not help. A workspace owner or admin has to change your role first, in Settings → Members. The error names your role and links there:
  • code: "agent_not_permitted" — no agent may do this at any level: billing, platform administration, managing connected agents, invites and member changes, switching workspaces, and revealing or rotating a destination’s signing secret.

Revoke

Settings → Connected agents in the console lists everything you have connected, what each may do, and when it last acted. Revoking takes effect on the agent’s next call, even though its token is still valid, because Hookie checks its own grant on every request. Agents that call Hookie with a user-delegated WorkOS Agent Auth token are listed here too, as WorkOS agent, and follow the same rules: read-only until you widen them, revocable at once. See WorkOS Agent Auth.

Tools

Every agent is shown every tool. Each table names the scope a call needs, and a call above the agent’s scope is refused as described under When an agent is refused. Needs hookie:read: Needs hookie:write: The hosted server doesn’t offer a tool that tails live events, because a tool call should return promptly rather than hold a connection open. To tail events, read the live stream with an ingest key. Needs hookie:manage — the routes the console keeps to owners and admins: There is no create_dataset, because a dataset is not something you create. A dataset is a name records carry: it exists the moment the first record is routed into it, and the console has no way to make an empty one either. Name it in a rule, an endpoint, or a workflow’s entry_dataset and it appears. Every tool carries MCP annotations, so a client can tell at a glance which calls are safe. readOnlyHint is derived from the tool’s required scope rather than maintained by hand, so it cannot disagree with what the tool is allowed to do. destructiveHint is set where something can be unrecoverable: delete_webhook, delete_rule, delete_destination, delete_record_view, delete_record, revoke_ingest_key, and delete_workflow, whose permanent: true deletes for good. An annotation covers the whole tool, so a client may ask to confirm a plain deactivation too. It is deliberately not set on replay_delivery and replay_deliveries, which re-send: prompting for confirmation on a reversible action trains people to click through the ones that matter.

Addressing an endpoint you just created

An endpoint’s public URL is {workspace}/{project}/{endpoint-slug}, and the endpoint slug is a high-entropy value the server mints — not the readable slug you passed in, which is stored as base_slug and never appears in a URL. You do not have to assemble any of that. create_webhook and list_webhooks both return public_path and public_url, and public_path is exactly the string send_test_event takes:
webhook_slug is the credential — anyone holding it can post events to your workspace, which is why the URL needs no other authentication. So are public_path and public_url, which contain it. base_slug and version are the readable identity and are safe to log.
If you do need the pieces, get_workspace gives the first segment. A wrong path and a disabled endpoint both answer the same 404, so check enabled before assuming the URL is wrong. update_webhook is narrower than it sounds, deliberately. An endpoint’s public URL is its credential, and its criteria and mappings define what it has already ingested; changing those in place would quietly reinterpret history. To change them, publish a new version with create_webhook_version, or rotate the URL with rotate_webhook. A destination is different: update_destination can rename it or move it to a new URL, and it keeps its id and signing secret, so its receiver keeps verifying.

Bringing your own client

The hosted server speaks MCP’s Streamable HTTP transport at https://app.hookie.ai/mcp: POST JSON-RPC, no session header required. Authentication is standard OAuth 2.1, so any client that speaks it can connect without an MCP library. Start with our protected-resource document, which names the authorization server to register with:
Ask the authorization server only for the scopes it advertises (openid, profile, email, offline_access). Hookie’s own hookie:* scopes are not requested there. They are granted by you in the console, and asking WorkOS for them fails the authorization outright.
PKCE is required, because agents are public clients that cannot keep a secret and the authorization code travels through a terminal. Registration is open because agents are installed per developer rather than registered by us ahead of time; a freshly registered client can only read until a human grants it more in the console. Hookie is the resource server: it verifies the access token offline against WorkOS’s signing keys, then applies the grant you set. The token authenticates the same /admin/api/* routes the console itself calls, so there is no second, weaker API to learn.