← Back to Plugins
Tools

Indy Agent

RainnWorks By RainnWorks 👁 161 views ▲ 0 votes

@rainnworks/indy — openclaw/MCP plugin giving AI agents access to Indy.fr French accounting: categorize transactions, file VAT, upload receipts, read financial statements.

GitHub

Install

OpenClaw Plugin

Install as

Configuration Example

plugins:
  entries:
    indy:
      enabled: true
      config:
        refreshToken: "<your-token>"

README

# @rainnworks/indy

> Give AI agents full access to French accounting — categorize transactions, file VAT, upload receipts, read financial statements — all through [Indy.fr](https://app.indy.fr).

> Personal project: I built this for myself to simplify my own accounting workflows in Indy. It is intended for personal use on my own account.

> Compliance note: use this only in ways permitted by your contract and applicable laws. You are responsible for your own usage, credentials, and account access.

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
[![Runtime: Bun](https://img.shields.io/badge/Runtime-Bun-black.svg)](https://bun.sh)
[![Tools: 65](https://img.shields.io/badge/Tools-65-green.svg)](#tool-inventory-65-tools)

---

## What is Indy?

[Indy.fr](https://app.indy.fr) is a French accounting SaaS platform used by tens of thousands of freelancers, consultants, and small companies (IS/BIC regime). It handles:

- **Daily bookkeeping** — bank transaction sync, categorization against the Plan Comptable Général (PCG), receipt attachment
- **Tax declarations** — monthly/quarterly VAT (CA3/CA12), corporate tax advances (2571), DAS2 (fees), annual closing (AG/PV)
- **Financial reporting** — balance sheet (bilan), income statement (compte de résultat), trial balance (balance générale)
- **Client invoicing** — create, track, and reconcile client invoices

All of this happens through a web app at `app.indy.fr`.

## Why does this exist?

Indy's web interface is designed for humans clicking through forms. But accounting is repetitive — categorizing transactions, checking VAT rates, uploading receipts — and AI agents are good at repetitive tasks when given clear tools and process guidance.

I built this to simplify my own bookkeeping operations and reduce repetitive work. It wraps common accounting actions into **standalone executable tools** and pairs them with skill files that explain the workflow logic so an agent can execute tasks consistently.

## What is this?

`@rainnworks/indy` is an [OpenClaw](https://github.com/nicepkg/openclaw) plugin that provides:

- **65 standalone tool binaries** — each a self-contained ~27KB Bun script. No framework needed at runtime. Pass JSON params, get JSON back.
- **Structured skill files** — markdown documents organized as parent routers + detail sub-files that teach agents the workflow logic (decision trees, cross-workflow jumps, edge cases).
- **OS-level security model** — when creating an agent, you copy only the binaries and skill files it needs into its workspace. If a binary isn't in the folder, the agent can't call it. No allowlists to misconfigure.
- **CLI** — human-friendly commands for quick lookups (`openclaw indy transactions`, `openclaw indy dashboard`).

### How it fits together

```
┌─────────────────────────────────────────────────┐
│  Source: openclaw-indy/                         │
│    bin/          ← 65 standalone tool binaries  │
│    skills/indy/  ← 18 skill files (7 parents   │
│                    + 9 sub-files + SKILL.md     │
│                    + context.md)                │
│    src/          ← TypeScript source            │
└──────────────┬──────────────────────────────────┘
               │  cp only what you need
               ▼
┌─────────────────────────────────────────────────┐
│  Agent workspace: ~/agents/my-agent/            │
│    tools/   ← subset of binaries for this job   │
│    skills/  ← subset of skill files for this job│
└─────────────────────────────────────────────────┘
```

---

## Two Ways to Use It

### Option A: Standalone Binaries (recommended for custom agents)

The repo ships pre-built binaries in `bin/` and compiled JS in `dist/` — no build step needed. Clone and go.

```bash
git clone https://github.com/rainnworks/openclaw-indy.git
cd openclaw-indy
```

Each binary is a self-contained Bun script (~27KB). Pass `INDY_REFRESH_TOKEN` as an env var and optional JSON params as the first argument:

```bash
# Check how many transactions need categorizing
INDY_REFRESH_TOKEN="..." ./bin/indy-categorize-count.js

# Get the fiscal dashboard
INDY_REFRESH_TOKEN="..." ./bin/indy-get-dashboard.js '{"year":"2025"}'

# Search transactions
INDY_REFRESH_TOKEN="..." ./bin/indy-list-transactions.js '{"search":"stripe","page":1}'
```

To create an agent, copy only the binaries + skill files it needs into its workspace (see [Creating Agents](#creating-agents) below).

### Option B: OpenClaw Plugin

Install as a managed OpenClaw plugin. All 65 tools register automatically — read tools are available by default, write tools require opt-in via the agent allowlist.

```bash
openclaw plugins install @rainnworks/indy
```

Add your token to the OpenClaw config:

```yaml
plugins:
  entries:
    indy:
      enabled: true
      config:
        refreshToken: "<your-token>"
```

Enable write tools per-agent:

```json5
{
  agents: {
    list: [{
      id: "main",
      tools: {
        allow: [
          "indy_set_accounting_account",   // specific tool
          "indy",                           // all tools from this plugin
          "group:plugins",                  // all plugin tools
        ]
      }
    }]
  }
}
```

The plugin ships skills at `skills/indy/` which load automatically when the plugin is enabled.

### Getting your refresh token

Authentication uses your own Indy session refresh token.

1. Open [app.indy.fr](https://app.indy.fr), log in, open browser console (F12) and paste:

```js
(async()=>{const r=indexedDB.open('firebaseLocalStorageDb');r.onsuccess=()=>{const tx=r.result.transaction('firebaseLocalStorage','readonly');tx.objectStore('firebaseLocalStorage').getAll().onsuccess=async(e)=>{const t=e.target.result[0]?.value?.stsTokenManager?.refreshToken;if(!t){console.error('No refresh token found. Are you logged in?');return}try{await navigator.clipboard.writeText(t);console.log('✅ Refresh token copied to clipboard!')}catch{console.log('⚠️  Could not auto-copy. Here is your refresh token:\n\n'+t)}}}})()
```

2. Verify it works:

```bash
INDY_REFRESH_TOKEN="<your-token>" ./bin/indy-get-user.js
```

### Rebuilding (optional)

The `bin/` and `dist/` directories are committed to the repo — you only need to rebuild if you modify the source.

```bash
bun install
bun run build.ts          # regenerate bin/ (65 standalone binaries)
npx tsc                   # regenerate dist/ (compiled JS for OpenClaw plugin)
```

---

## Tool Inventory (65 tools)

### Auth & Profile

| Tool | Description |
|------|-------------|
| `indy-login` | Setup instructions or verify a token |
| `indy-get-user` | User profile: name, email, company, SIRET, regime, plan |
| `indy-get-payment` | Subscription and billing info |

### Transaction Categorization (core daily workflow)

| Tool | Description |
|------|-------------|
| `indy-list-pending-transactions` | Uncategorized transactions queue |
| `indy-categorize-count` | Count of transactions needing categorization |
| `indy-get-similar-transactions` | Find previously categorized matches for a transaction |
| `indy-get-similar-transactions-to-split` | Find split patterns for multi-category transactions |
| `indy-get-category-groups` | All accounting categories (PCG codes) |
| `indy-set-accounting-account` | ⚠️ Set the accounting category on a transaction subdivision |
| `indy-set-transaction-vat` | ⚠️ Set VAT rate (domestic, non-EU/intracom, or to-be-defined) |
| `indy-annotate-transaction` | ⚠️ Add/update a note on a transaction |
| `indy-get-transaction` | Get a single transaction by ID |
| `indy-list-transactions` | Search/filter the full ledger |
| `indy-get-transaction-filters` | Valid filter values (accounts, categories, date ranges) |
| `indy-get-matching-invoices` | Find client invoices matching transaction IDs |

### Receipts

| Tool | Description |
|------|-------------|
| `indy-get-receipts` | Receipts attached to a transaction |
| `indy-get-receipt` | Single receipt by ID (with OCR data) |
| `indy-upload-receipt` | ⚠️ Attach a receipt to a transaction (file path or base64) |
| `indy-upload-standalone-receipt` | ⚠️ Upload a receipt without attaching to a transaction |
| `indy-list-unpaired-receipts` | Receipts not linked to any transaction |
| `indy-get-receipt-matching-transactions` | Find bank transactions matching a receipt |
| `indy-get-matching-receipts` | Find receipts matching a list of transaction IDs |
| `indy-update-receipt-data` | ⚠️ Correct OCR-extracted receipt metadata |

### Manual Transactions

| Tool | Description |
|------|-------------|
| `indy-get-manual-transaction-types` | Available types: professionalExpense, cashIncome, etc. |
| `indy-create-manual-transaction` | ⚠️ Create an expense note, cash transaction, or personal income |
| `indy-create-transaction-from-receipt` | ⚠️ Create a transaction using a receipt's OCR data |
| `indy-delete-manual-transaction` | ⚠️ Delete a manually created transaction |

### VAT & Closing

| Tool | Description |
|------|-------------|
| `indy-get-vat-config` | VAT regime: hasVat, frequency, liability type |
| `indy-list-activities` | All fiscal obligations with deadlines and status |
| `indy-refresh-closing` | Force-refresh closing state for a declaration period |
| `indy-get-closing-state` | Read-only closing state (faster, no refresh) |
| `indy-get-categorize-all-status` | Uncategorized transactions blocking a closing |
| `indy-get-vat-rate-verification` | Transactions with undefined VAT in a closing period |
| `indy-set-closing-step-status` | ⚠️ Mark a closing step as done |
| `indy-get-vat-company-identity` | Company identity for a VAT declaration |
| `indy-set-vat-company-identity` | ⚠️ Update company identity (SIRET, IBAN, address) |
| `indy-get-vat-declaration-summary` | CA3/CA12 declaration lines with amounts |
| `indy-validate-vat-declaration-summary` | ⚠️ Confirm the declaration summary step |
| `indy-get-vat-credit-refund` | VAT credit refund eligibility and amounts |
| `indy-validate-vat-credit-refund` | ⚠️ Confirm the cre

... (truncated)
tools

Comments

Sign in to leave a comment

Loading comments...