Era Context MCP

Coming soon

OAUTH 2.1

FINANCE

Accounting & Finance

Every transaction, account, and spending category your finance agent needs to manage lives in Era Context. Era Context MCP gives your agent per-user OAuth access to financial data scoped to the authorizing account.

  • Acts as the user: Transaction edits and tag changes stay tied to the Era Context user who authorized the agent.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: User permissions enforced. 90-day audit trail.
Era Context MCP
agent · Acme Q3
Run
Recategorize last month's Amazon transactions as Office Supplies.
S
eracontextmcp_transactions_update
112ms
Finance agent
42 Amazon transactions recategorized to Office Supplies. Total reclassified: $3,847.21 across operating and reserve accounts.
Sources: Era Context, last 30 days
eracontextmcp
42
18:29
Message Claude...

Tools your agent reaches for on Era Context MCP, scoped per user.

CALL ANY TOOL
List accounts, search and bulk-update transactions, manage tags, transfers, and spending categories. Same toolkit, every framework, no auth plumbing.
eracontextmcp_accounts_list
List financial accounts
List all financial accounts available to the authorized user including connected institutions and manual accounts.
Parameters
Name
Type
Required
Description
status
string
Optional
Filter by account status: active, archived
eracontextmcp_transactions_search
Search transactions
eracontextmcp_transactions_update
Bulk update transactions
eracontextmcp_transfers_manage
Manage transfer links
eracontextmcp_tags_manage
Manage transaction tags
eracontextmcp_categories_manage
Manage spending categories
Build your Agent
Drop the toolkit in, point it at the user, and your agent can query and edit Era Context transactions from the first run.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { DynamicStructuredTool } from "@langchain/core/tools";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { z } from "zod";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["eracontextmcp"], toolNames: ["eracontextmcp_accounts_list", "eracontextmcp_transactions_search", "eracontextmcp_transactions_update"] },
pageSize: 100,
});

const lcTools = tools.map((t) => new DynamicStructuredTool({
name: t.tool.definition.name,
description: t.tool.definition.description,
schema: z.object({}).passthrough(),
func: async (args) => {
const { data } = await sk.tools.executeTool({
toolName: t.tool.definition.name,
identifier: "user_123",
params: args,
});
return JSON.stringify(data);
},
}));

const agent = createReactAgent({ llm, tools: lcTools });
import { ScalekitClient } from "@scalekit-sdk/node";
import OpenAI from "openai";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["eracontextmcp"], toolNames: ["eracontextmcp_accounts_list", "eracontextmcp_transactions_search", "eracontextmcp_transactions_update"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
type: "function",
function: {
name: t.tool.definition.name,
description: t.tool.definition.description,
parameters: t.tool.definition.input_schema,
},
}));

const resp = await openai.responses.create({
model: "gpt-4o", input: prompt, tools: llmTools,
});
import { ScalekitClient } from "@scalekit-sdk/node";
import Anthropic from "@anthropic-ai/sdk";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["eracontextmcp"], toolNames: ["eracontextmcp_accounts_list", "eracontextmcp_transactions_search", "eracontextmcp_transactions_update"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
name: t.tool.definition.name,
description: t.tool.definition.description,
input_schema: t.tool.definition.input_schema,
}));

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6", max_tokens: 1024,
tools: llmTools,
messages: [{ role: "user", content: prompt }],
});
import { Agent } from "@google/adk/agents";
import {
MCPToolset, StreamableHTTPConnectionParams,
} from "@google/adk/tools/mcp";

const toolset = new MCPToolset({
connectionParams: new StreamableHTTPConnectionParams({
url: "https://mcp.scalekit.com/eracontextmcp",
headers: { Authorization: `Bearer ${userScopedToken}` },
}),
});

const agent = new Agent({
name: "agent", model: "gemini-2.0-flash",
tools: await toolset.getTools(),
});
Try these prompts
Paste any prompt into your agent to start managing Era Context finances from your workflows.
Search & recall
Copy the prompt
Copied
Find all uncategorized transactions from last month.
Copy the prompt
Copied
Show transactions over $[amount] tagged as [tag].
Copy the prompt
Copied
List all spending categories and their total spend YTD.
Bulk actions
Copy the prompt
Copied
Recategorize all [merchant] transactions as [category].
Copy the prompt
Copied
Mark all transactions from [date] as reviewed.
Copy the prompt
Copied
Merge duplicate [category A] and [category B] categories.
SEE HOW AUTH WORKS
Users authorize Era Context once. Their credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
Era Context MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Era Context MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Era Context MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Era Context MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
Same per-user auth pattern across other finance and accounting connectors.
No items found.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
Other connector libraries treat auth as a demo afterthought. Scalekit starts with user identity, scope enforcement, and audit.
01.
Shared tokens break per-user analytics
A shared token looks fine in a demo. In production every call looks like a service account. Scalekit resolves the real user credential so attribution, audit, and scope stay accurate.
// shared token
 audit → bot_service_account
 user_filter → broken

 // scalekit
 audit → user_abc
 scope → enforced ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Era Context MCP today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Era Context as the user or a shared account?
As the user. Each account authorizes once and Scalekit resolves their credential at request time. All edits are attributed to that user.
Where is the Era Context OAuth token stored?
In Scalekit's AES-256 vault, namespaced per tenant. Refresh is automatic. Tokens never appear in prompts or LLM context.
Can I prevent the agent from bulk-updating transactions?
Yes. Use listScopedTools to allow read-only operations — search and list — without granting the transactions_update tool.
What happens when a user revokes Era Context access?
The connection is invalidated on the next tool call. Subsequent requests fail closed. Other users remain unaffected.
Is this safe for production finance workflows?
Yes. Per-user credential isolation, scope enforcement before every call, and a 90-day audit trail are built in. Every edit executes as the authorizing user.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""eracontextmcp"": {
""url"": ""https://mcp.scalekit.com/eracontextmcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.eracontextmcp]
url = ""https://mcp.scalekit.com/eracontextmcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""eracontextmcp"": {
""url"": ""https://mcp.scalekit.com/eracontextmcp"",
""type"": ""http""
}
}
}