---
title: Build with Veefore
description: Everything you need to protect an agent, wire up its tools, and ship it behind enforcement.
label: Overview
---

This section is the developer path. All you need is an agent you want to put
behind Veefore. The CLI connects to hosted Veefore on its own; if your
organization runs its own, it gives you the address once
([Self-host Veefore](/install)).

## The shortest route

```bash
npm install -g veefore
cd your-agent-project
veefore
```

One command signs you in through the browser, scans the project, registers the
agent and its tools, and wraps each tool in `guard()`. Every step asks first.
[Automatic setup](/build/automatic-setup) explains exactly what it does.

:::cards

:::card Automatic setup | /build/automatic-setup | ⚡
What `veefore` finds, creates and changes, and how to do any part by hand.
:::

:::card Protect an agent | /build/protect-an-agent | ⌨
The full integration: config, guard(), errors, approvals.
:::

:::card Write your first policy | /build/first-policy | ⚖
A real policy built one rule at a time, from real traffic.
:::

:::card Register a tool | /build/register-a-tool | ⚒
Make your system something an agent can be authorized for.
:::

:::card Broker a credential | /build/broker-a-credential | ⚿
Take the secret out of the agent entirely.
:::

:::

## Pick your language

:::cards

:::card TypeScript SDK | /build/javascript-sdk
`@veefore/sdk`. `guard()`, the client surface, typed errors.
:::

:::card Python SDK | /build/python-sdk
`veefore-py`. Same model, same wire format, same guarantees.
:::

:::card No SDK | /build/sign-your-own-assertion
The wire protocol in full. Any language that can sign Ed25519.
:::

:::

## The integration, in order

1. **Install the CLI** with `npm install -g veefore`.
2. **Run `veefore`** in the agent project. It signs you in, registers the agent
   and its tools, and [wraps each tool](/build/automatic-setup) in `guard()`.
3. **[Review the tools](/build/register-a-tool)** it registered, and add any it
   missed.
4. **[Move the credentials](/build/broker-a-credential)** into the broker so the agent no longer holds them.
5. **[Write a policy](/build/first-policy)** from what you observed, not from what you assumed.
6. **[Handle refusals](/build/errors-and-retries)** properly — this is the step that gets skipped.
7. **[Gate CI](/build/ci-gate)** so a policy regression fails the build.
8. **[Promote to ENFORCE](/journey/enforce)**.

## Everything else

| | |
| --- | --- |
| [Delegate authority](/build/delegate-authority) | Sub-agents and bounded grants |
| [Handle approvals](/build/handle-approvals) | Waiting on a human without blocking a worker |
| [MCP](/build/mcp) | Register servers, authorize discovered tools |
| [A2A](/build/a2a) | Verified connections to agents you do not own |
| [API keys](/build/api-keys) | Programmatic access for your own services and CI |
| [Webhooks](/build/webhooks) | Signed delivery, and why a webhook is not an authorization |
| [Errors and retries](/build/errors-and-retries) | Which refusals to handle, which never to retry |
| [Idempotency](/build/idempotency) | Safe retries on mutating requests |
| [Local development](/build/local-development) | Fast loop, fake downstreams, real decisions |
| [Examples](/build/examples) | Four working programs in `examples/` |

## Two things worth internalising first

:::security The SDK is not the boundary
Every decision is computed server-side by the gateway, on every call. The SDK
formats requests, signs assertions and gives you typed errors. It cannot grant
authority and it does not cache a permission.

The practical consequence: do not build logic that depends on the SDK having
checked something. It has not. Branch on `decision.allowed`, which is the
server's answer.
:::

:::warning A refusal is an answer, not a failure
`BLOCK`, `REQUIRE_APPROVAL`, `AUTHORITY_EXCEEDED`, `APPROVAL_DENIED` — these are
decisions. Retrying produces the same decision and burns your rate limit.

Retry transport errors and `503`s with backoff. Never retry a `403`. The SDK
already follows this rule: it retries transport failures and never retries a
decision. [Full table](/build/errors-and-retries).
:::
