tally-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tally-mcp-serverShow outstanding balances for all customer ledgers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tally-mcp-server
An MCP (Model Context Protocol) server that exposes TallyPrime data to any MCP-compatible client (Claude Desktop, Claude Code, etc.) over Tally's classic XML HTTP API - the integration method supported by every Tally.ERP 9 / TallyPrime release.
Available tools
Tool key | What it returns |
| Companies known to the running Tally instance |
| All ledger accounts, with opening/closing balances |
| All accounting groups (chart-of-accounts categories) |
| All inventory items, with closing qty/rate/value |
| Vouchers posted between two dates ( |
| Ledgers in a group with closing balance (receivables/payables) |
Related MCP server: Tally Prime MCP Server
How it talks to Tally
TallyPrime can act as an HTTP server and accept an XML "envelope":
<ENVELOPE><HEADER>...</HEADER><BODY>...</BODY></ENVELOPE>. Two request
shapes are used here:
Built-in reports (e.g.
list_companies) - just name the report, no TDL needed.Custom collections (everything else) - an inline TDL
<COLLECTION>naming a native Tally object type (Ledger,Group,StockItem,Voucher) and the fields to fetch. This is the standard technique for "give me all X" pulls and is what most third-party Tally integrations use.
Docs: https://help.tallysolutions.com/developer-reference/introduction/integration-with-tallyprime/
1. Enable Tally as an HTTP server
In TallyPrime: F1 (Help) → Settings → Connectivity → Client/Server
configuration → set "TallyPrime acts as" to Server, and note the port
(default 9000).
2. Install
npm install
cp .env.example .env
# edit .env if your Tally isn't on localhost:90003. Run standalone (for testing)
npm startThe server speaks MCP over stdio, so running it directly won't print
anything to stdout - that's expected. Ctrl+C to stop.
4. Connect it to an MCP client
Example Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"tally": {
"command": "node",
"args": ["/absolute/path/to/tally-mcp-server/src/index.js"]
}
}
}Project structure
src/
├── index.js # MCP server bootstrap - wires everything together
├── config.js # Reads TALLY_HOST / TALLY_PORT / etc. from .env
├── tally/
│ ├── client.js # Generic transport: builds/sends the XML envelope,
│ │ # parses the XML response into a plain object
│ └── endpoints/
│ ├── index.js # Registry - list every supported Tally API here
│ ├── companies.js # Built-in report example
│ ├── ledgers.js # Custom TDL collection example
│ ├── groups.js
│ ├── stockItems.js
│ ├── dayBook.js # Collection example with runtime params (dates)
│ └── outstanding.js # Collection example with a filter
└── tools/
└── index.js # Turns every registered endpoint into an MCP toolThe split matters:
tally/client.jsonly knows how to transport a request (build the XML envelope, POST it, parse the XML response, surface errors). It has zero Tally-report-specific knowledge.tally/endpoints/*.jseach describe one Tally API: what to request (request: { kind, ... }), any input parameters it needs, and how to turn Tally's parsed XML into a clean shape.tools/index.jsloops over the endpoint registry and callsserver.tool(...)for each one - so a new endpoint becomes a working MCP tool automatically, with no changes to the server or client code.
Adding a new Tally API
Say you want to add "List Cost Centres":
Create
src/tally/endpoints/costCentres.js, modeled ongroups.js:import { asArray } from "../client.js"; export default { key: "list_cost_centres", title: "List Cost Centres", description: "Returns cost centres from TallyPrime.", inputSchema: {}, request: { kind: "collection", collectionName: "MCP CostCentres", type: "CostCentre", fetch: ["NAME", "PARENT", "CATEGORY"], }, parseResponse(parsedXml) { const entries = asArray(parsedXml?.ENVELOPE?.COSTCENTRE); return entries.map((e) => ({ name: e["@_NAME"] ?? e.NAME, parent: e.PARENT, category: e.CATEGORY, })); }, };Register it in
src/tally/endpoints/index.js(import + add to theendpointsarray).Restart the server.
list_cost_centresis now a callable MCP tool - nothing else needs to change.
If an endpoint needs runtime parameters (dates, a filter value, etc.),
add zod validators to inputSchema and read them in request.staticVariables(params)
and/or request.buildFilterValue(params) - see dayBook.js and
outstanding.js for examples.
Troubleshooting
"Could not reach TallyPrime" - Tally isn't running, isn't configured as a server, or
TALLY_HOST/TALLY_PORTin.envdon't match.Empty results or
<LINEERROR>- the report/collectionidor TDL field names may need adjusting for your Tally release or company configuration. Turn on Tally's "Test Client" / check the Tally log screen while a request runs to see exactly what it received.Unexpected shape in
list_companies-parseResponse()tries a few likely XML shapes and falls back to returning the raw parsed payload with awarningfield so you can see exactly what Tally sent back and adjust the parser.Numbers coming back as strings/numbers inconsistently - Tally's XML doesn't strongly type values;
fast-xml-parserdoes its best guess. If you need guaranteed types, cast explicitly insideparseResponse().
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables interaction with the QuickBooks Online Accounting API to manage customers, invoices, expenses, and payments through MCP-compatible clients. It supports comprehensive financial workflows and the generation of reports like Profit and Loss or Balance Sheets.1002Apache 2.0
- Alicense-qualityBmaintenanceEnables Large Language Models to access and query Tally Prime ERP data, including financial reports, masters, and inventory summaries, via the Model Context Protocol.63MIT
- Alicense-qualityBmaintenanceConnects Tally Prime ERP data to AI assistants via MCP, enabling natural language queries for financial reports, stock summaries, and ledger balances.MIT
- FlicenseAqualityDmaintenanceProvides double-entry accounting ledger creation, transaction recording, and financial reporting capabilities via MCP.7
Related MCP Connectors
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
MEOK ABCI Bridge MCP — read-only Tendermint / Cosmos blockchain query for agents. Built-in registry
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tejash-bhandari-dev/tally-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server