# Indraft [Health: Active]

**Category:** 💻 Developer Tools  
**Repository:** https://github.com/indraftio/indraft  
**GitHub Stars:** 0  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/indraft

## Description
Read and write a CRM built for agents. Every change carries who asserted it and how.

## Claude Desktop Quick Installation
Remote MCP endpoint (confidence: high). Install path detected from listing signals. Add as a URL/SSE server in your client:

```json
"mcpServers": {
  "indraft": {
    "url": "https://api.indraft.io/mcp"
  }
}
```

## Documentation & README

# Indraft

**A CRM your AI agent can actually run.** Connect Claude, ChatGPT, Cursor or any
MCP client and it can read and write companies, contacts, opportunities, tasks
and interactions from the first request, with no schema to design first.

MCP server: `https://api.indraft.io/mcp` · [indraft.io](https://indraft.io) ·
[Docs](https://indraft.io/docs)

---

## Connect it

### Claude

```
claude mcp add --transport http indraft https://api.indraft.io/mcp
```

Claude opens a browser to authorize. Nothing to paste, no API key to store.

In Claude Desktop or claude.ai, add it as a custom connector with the same URL.

### ChatGPT

Settings → Connectors → Add custom connector, URL `https://api.indraft.io/mcp`.
It authorizes over OAuth.

### Cursor, Windsurf, VS Code, and other MCP clients

Any client that speaks Streamable HTTP and OAuth 2.1 works. Point it at
`https://api.indraft.io/mcp`.

Then paste this and your agent will set itself up:

> Set up Indraft for my business. Read its CRM schema first, then tell me what
> you think we do and how you plan to model it, and wait for my answer before you
> write anything.

It reads the schema before it writes, so it learns the object types, the limits
and what it is allowed to do without you explaining any of it.

---

## Why this exists

Most CRMs were built for a person clicking through forms, and an agent using one
is doing screen-scraping with extra steps: guessing field names, inventing
records, and overwriting things somebody already checked.

Indraft is built the other way round.

**Every value records who asserted it and how.** Observed, inferred, imported,
supplied by a person, or confirmed by a person. Those rank, and a weaker claim
cannot quietly overwrite a stronger one, so your agent's guess never overwrites
what you checked. A write that was held says so rather than reporting success.

**Every change is on the record.** The actor, the surface it arrived through,
and the field-level diff. Most changes can be undone.

**It is populated from the first request.** Companies, contacts, opportunities,
tasks and interactions exist before you configure anything, with a pipeline that
can actually close a deal. Custom fields and your own object types are there when
you need them, defined by asking.

**It refuses rather than guessing.** A total that crosses currencies is refused
unless you have stated a rate, and every converted answer names the rate it used
and who asserted it. There is no bulk delete.

---

## The tools

45, covering reading, writing, schema changes, merges, bulk imports and
aggregation. An agent is only shown the ones its credential can actually call.

Full reference, generated from the server's own catalogue: **[TOOLS.md](https://github.com/indraftio/indraft/blob/HEAD/TOOLS.md)**

Every tool carries a human-readable `title` and the applicable `readOnlyHint`,
`destructiveHint` and `openWorldHint`, so a client can tell a read from a write
before it calls one.

---

## TypeScript SDK

For your own service, when you want the REST API rather than MCP. The source is
in [`sdk/`](https://github.com/indraftio/indraft/blob/HEAD/sdk); an npm release follows.

```ts
import { IndraftClient } from "./sdk";

const indraft = new IndraftClient({ token: process.env.INDRAFT_TOKEN });

const { record } = await indraft.upsertCompany({
  name: "Halden Freight",
  domain: "halden.example",
  industry: "Logistics",
  // Say how you know. An import is weaker than a person, and Indraft enforces
  // that rather than trusting the last writer.
  assertionKind: "imported",
  idempotencyKey: "nightly-sync-halden",
});
```

Errors are typed and carry a recovery hint rather than a status code alone:

```ts
import { IndraftError } from "./sdk";

try {
  await indraft.upsertCompany({ name: "Halden Freight", industry: "Retail", overrideStanding: true });
} catch (error) {
  if (error instanceof IndraftError && error.code === "standing_override_refused") {
    // This workspace does not permit overrideStanding. Send the write again
    // without it: it applies to every field it is strong enough to move and
    // reports the rest in `held[]`, and a person can confirm a contested value.
    console.error(error.recoveryHint);
  }
}
```

A cross-currency total is not an error, it is a different answer. Ask for a sum
over deals in several currencies with no rate on file and the aggregate comes
back grouped per currency rather than summed, because a total that silently
mixes currencies is the failure this product refuses to commit.

See [`sdk/`](https://github.com/indraftio/indraft/blob/HEAD/sdk) for the source. MIT.

---

## Also available

- **REST API** with a published [OpenAPI description](https://api.indraft.io/v1/openapi.json)
- **Official MCP registry**: `io.indraft/mcp`
- **Export everything, any time**: one spreadsheet per table, the whole workspace
  as JSON, and a README explaining how the files join up. Nothing is left out and
  nothing is trimmed to fit.

---

## Status

Indraft is live at [indraft.io](https://indraft.io). Free tier, no card.

Issues and questions are welcome here. Security reports go to
`koshea@justicebid.com` rather than a public issue.

## License

MIT for the SDK and everything in this repository. The hosted service has its own
[terms](https://indraft.io/legal/terms) and [privacy policy](https://indraft.io/legal/privacy).

