# Quickstart

> From a Graft account to the first tool built for your agent, in under ten minutes, with Claude, ChatGPT, Hermes or OpenClaw.

Source: https://docs.getgraft.ai/graft/get-started/quickstart

In about ten minutes your agent will have a tool nobody wrote by hand. Graft's model writes it against a service's API, tests it against the real service without changing anything, and adds it to your agent's list. This guide uses httpbin, a public API that needs no account, and then GitHub.

## The fastest path

[getgraft.ai](https://getgraft.ai) has this prompt with the connection steps for your agent already filled in: pick Claude, ChatGPT, Claude Code, Codex, Hermes or OpenClaw there and copy it. The version below is the general one. Paste it into your agent; it has the agent give you the one step you do by hand, connecting Graft, and then drive the rest through Graft's tools: connecting a service and approving the build arrive as cards in the chat or as pages Graft sends you to, and the tool is built and run for you.

```text
Help me set up Graft and get my first tool built.

Graft is a service that lets an AI agent acquire the tools it lacks. When I ask you for something you have no tool for, Graft reads the service's public documentation, writes a small tool for that one job, tests it against the real service with anything that would change data stopped at Graft's proxy, and adds the tool to your list. My credentials are entered on Graft's own pages and never appear in the tool's code, the sandbox it runs in, or any model.

If you can already see Graft's tools, skip the setup and go straight to using them.

We are using Graft Cloud: hosted, nothing to install, free for a limited time during the alpha. Do not ask me to choose a hosting method. Only ask a setup question if it is necessary to identify the client or resolve a specific blocker. If I say I want to self-host instead, give me https://docs.getgraft.ai/graft/self-hosting/docker-compose and stop; I know what to do from there.

I am using another MCP-compatible agent. If Graft is not connected, identify the client and version from the current environment; if you cannot, ask me only which client I use. Follow that client's official setup instructions and https://docs.getgraft.ai/graft/harnesses/any-mcp-client.md. The client must support remote Streamable HTTP, not just local stdio servers.

Connect to https://app.getgraft.ai/mcp. Prefer MCP OAuth with automatic client registration if supported: I sign in on Graft's consent page, keep "A new agent" and choose Connect. Otherwise I create an agent at https://app.getgraft.ai and store its token through the client's supported secret/environment mechanism myself. Configure an Authorization bearer header without asking for the token in chat. Use the client's own configuration schema and environment-reference syntax; they are not interchangeable across clients.

Preserve existing server settings. Give me only this client's required steps and wait for me to complete sign-in or token entry. Then reload the actual client session and verify Graft's tools are available. If this client cannot use the required transport or authentication, explain that specific blocker instead of claiming setup succeeded.

Once you can see Graft's tools, stop explaining setup and use them. Ask what I want done only if I have not already told you, then call Graft's tools; do not narrate the console or list manual steps. Look for an existing tool before asking Graft to build one, and build only when nothing fits. While Graft is building, relay its newest progress line in a sentence and keep waiting on the same job; if it fails, tell me what Graft reported rather than claiming success.

Connecting a service, confirming it and approving a build each arrive as a card in the chat or a page Graft sends me to. I answer there, never in the chat, and you never answer for me. If Graft says the card is shown, let me use it and repeat the link only if I cannot see it; otherwise send me the exact link with one line saying what it is, and wait. After I say I am done, call the same tool again with the same arguments. Never promise an extra approval step, and never ask me for a key, a token or a password.

When the tool lands, use it to do what I asked and show me the result. If your tool list has not refreshed yet, Graft's run_tool runs it by vendor and name with the input shape it returned; do not guess arguments.

Keep every message short. Explain unfamiliar terms only if I ask.

Docs, if you need them: https://docs.getgraft.ai/llms.txt (an index; every page is available as plain markdown at the linked .md address)
```

Or follow the steps yourself.

## What you need

- A Graft account. Graft Cloud's console is at `https://app.getgraft.ai`, and Graft Cloud is free for a limited time during the alpha. Self-hosted Graft answers at `http://localhost:3000` once [Docker Compose](https://docs.getgraft.ai/graft/self-hosting/docker-compose.md) has brought it up. The steps are the same either way; only the URL changes.
- An agent that speaks MCP. Only the first step differs between agents.

### Step 1: Connect your agent

**Claude or ChatGPT**

Add Graft as a custom connector with one URL: `https://app.getgraft.ai/mcp`, or your deployment's public origin plus `/mcp`. In Claude, **Settings → Connectors → Add custom connector**; in ChatGPT, **Settings → Connectors → Create**, with **Developer mode** turned on under **Advanced settings**. Leave any OAuth client id and secret fields empty: Graft registers the product itself.

Choose **Connect**. The product opens Graft's consent page; sign in or create an account. Keep **A new agent**, name it for the product, and choose **Connect**. That consent creates the agent the connection will be. Back in the product, turn the Graft connector on in the tools menu of a conversation.

The full steps, with what each screen shows, are on [Claude and ChatGPT](https://docs.getgraft.ai/graft/harnesses/claude-and-chatgpt.md).

**Hermes**

Sign in to the console and open **Agents → New agent**. Name it for where Hermes runs (`laptop Hermes`), keep the defaults, and choose **Create agent**. The token is shown once; put it where Hermes reads environment variables:

```bash
echo "GRAFT_TOKEN=grft_…" >> ~/.hermes/.env
```

In `~/.hermes/config.yaml`, under `mcp_servers`:

```yaml
mcp_servers:
  graft:
    url: "https://app.getgraft.ai/mcp"
    headers:
      Authorization: "Bearer ${GRAFT_TOKEN}"
```

Start a new Hermes session, or `/reload-mcp` in a running one when only the configuration changed. Graft's playbook arrives with the MCP handshake, so there is nothing else to install; the optional thin skill is on [Hermes](https://docs.getgraft.ai/graft/harnesses/hermes.md), with what Hermes does with approvals.

**OpenClaw**

Sign in to the console and open **Agents → New agent**. Name it for where OpenClaw runs, keep the defaults, and choose **Create agent**. The token is shown once; put it in the `.env` of the profile that runs your Gateway, on that host:

```bash
echo "GRAFT_TOKEN=grft_…" >> ~/.openclaw/.env
```

Then merge Graft into `mcp.servers` in that profile's `~/.openclaw/openclaw.json`, keeping any servers already there, exactly as the agent's page in the console shows it:

```json
{
  "mcp": {
    "servers": {
      "graft": {
        "url": "https://app.getgraft.ai/mcp",
        "transport": "streamable-http",
        "headers": { "Authorization": "Bearer ${GRAFT_TOKEN}" }
      }
    }
  }
}
```

Restart the Gateway so it loads the token (`openclaw mcp reload` is enough for a config-only change), and `openclaw mcp doctor graft --probe` checks the connection. The rest, including how approvals reach you, is on [OpenClaw](https://docs.getgraft.ai/graft/harnesses/openclaw.md).

For self-hosted Graft the URL is your deployment's origin plus `/mcp`; the agent's page in the console shows the right block for your deployment.

### Step 2: Ask for something no tool covers

```text
Get me a fresh UUID from httpbin.org.
```

The agent calls `find_tool` first. Nothing matches, and httpbin is not connected, so it calls `request_connection` with what it read in httpbin's documentation. In Claude and ChatGPT the ask is a card in the chat; elsewhere the agent hands you a link into the console.

### Step 3: Connect the service

The card names the vendor and the hosts and has one button. The link opens the same ask in the console, where the form arrives pre-filled with the agent's proposal: the vendor slug `httpbin`, the primary host `https://httpbin.org`, the auth scheme and its parameters, and the documentation page the agent read. It names every host the credential will be sent to, and nothing else. Edit anything that is wrong.

httpbin has no accounts, so it connects with no key at all. Choose **Connect**, on the card or on the form. The connection lands in this agent's scope, and the agent's waiting call answers `connected`.

> **Note**
>
> A secret is typed on Graft's own form, never in the chat. If an agent ever asks you for a key in chat, do not give it one; it is told to hand you a link instead.

### Step 4: Approve the build

The agent now calls `acquire`. Before Graft's model runs anything against the connection, you are asked once for this agent and this connection. Claude and ChatGPT draw the ask as a card in the chat with **Allow** and **Decline**; Hermes shows it as its own approval card, and any of its allow buttons is a yes; OpenClaw shows no card, so the agent relays a link and you answer under **Pending actions**.

### Step 5: Watch the tool land

`acquire` waits for the job and answers when it is done or when the wait runs out. Unfinished, the agent polls `acquire_status`, which waits for the next line, and relays each new progress line: reading the documentation, drafting the module, checking it, proving it with reads, publishing and dry-running it. When the dry run passes the tool is promoted and Graft tells the agent its list has changed.

The new tool is `httpbin__<name>`, first-class, with its own schema. It is read-only, so calling it asks nothing. Ask the agent for another UUID.

> **Note**
>
> Claude and ChatGPT read Graft's tool list when a conversation starts, so a tool built during a chat is offered first-class from the next conversation. In the current one the agent runs it through `run_tool`, and `acquire_status` tells it so. Hermes and OpenClaw re-read the list on their own.

### Step 6: Do it again with a real service

```text
List the open issues on getmodern-ai/graft.
```

The same shape: `request_connection` proposes `github` at `https://api.github.com` with a bearer token, you paste a personal access token on the form, you approve the build once for this agent and this connection, and a read tool lands. Ask for something that writes, a comment on an issue say, and the tool's first call asks you once; the answer holds for this agent from then on.

## What you have now

One agent, two connections, and two or three tools in your toolbox. Open the agent's page in the console: **Working set** lists what is promoted, **Approvals** what you have answered, and **History** every promotion and demotion with its cause. A tool unused for 21 days leaves the working set on its own and stays in the toolbox, one request from coming back.

A few more to try:

```text
Find the tool that fetches a UUID and put it back in your list.
```

```text
Create an issue on getmodern-ai/graft titled "Quickstart feedback" with a short note.
```

```text
Take the httpbin tool out of your list; I am done with it.
```

## Where next

- [Claude and ChatGPT](https://docs.getgraft.ai/graft/harnesses/claude-and-chatgpt.md): Every screen of the connector flow, and how tools and approvals reach a chat.
- [Hermes](https://docs.getgraft.ai/graft/harnesses/hermes.md): The full configuration, tool naming, and what Hermes does with approvals.
- [OpenClaw](https://docs.getgraft.ai/graft/harnesses/openclaw.md): The `mcp.servers` block in OpenClaw's own schema and how approvals reach you without buttons.
- [Connecting a vendor](https://docs.getgraft.ai/graft/connections/connecting-a-vendor.md): The connection form, field by field, and the host rule it enforces.
