OAUTH 2.0
ACCOUNTING
FreeAgent gives your agent small business accounting: create and send invoices, estimates, and credit notes, record bills and expenses, explain bank transactions, log time on projects, and read profit and loss, balance sheet, and cashflow reports.
For more tools, view docs.
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
// FreeAgent tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["freeagent"], toolNames: [
"freeagent_invoices_list",
"freeagent_invoice_send_email",
"freeagent_profit_and_loss_summary_get"] },
pageSize: 100,
});
const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find overdue invoices, email each one to its client again, and summarize this month's profit and loss" }] });import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["freeagent"] }, pageSize: 100,
});
const res = await openai.chat.completions.create({
model: "gpt-5",
messages: [{ role: "user", content: "Find overdue invoices, email each one to its client again, and summarize this month's profit and loss" }],
tools,
});
// Execute the tool call with the user's vaulted FreeAgent OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["freeagent"] }, pageSize: 100,
});
const msg = await anthropic.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Find overdue invoices, email each one to its client again, and summarize this month's profit and loss" }],
tools,
});
// Tool call runs with the user's vaulted FreeAgent OAuth token
await sk.tools.executeTool(msg.content, "user_123");import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["freeagent"] }, pageSize: 100,
});
const agent = new Agent({
name: "bookkeeping_agent",
model: "gemini-2.5-pro",
instruction: "FreeAgent tools scoped to this user",
tools,
});
await agent.run("Find overdue invoices, email each one to its client again, and summarize this month's profit and loss");// shared token
audit → bot_service_account
// scalekit
audit → user_abc ✓