Tools
Indy Agent
@rainnworks/indy — openclaw/MCP plugin giving AI agents access to Indy.fr French accounting: categorize transactions, file VAT, upload receipts, read financial statements.
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)
[](https://bun.sh)
[](#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