Allows an AI client to interact with ERPNext accounting by reading data and creating draft documents through a secure OAuth-protected interface.
Also known as Interlusion/enterich
- Stars
- 0
- Tools
- 37
- Downloads, 30 days
- —
- Latest version
- 0.5.0
- Last commit
- Nov 13, 2026
- License
- Apache-2.0
What is Enterich MCP?
Enterich allows an AI client to interact with ERPNext accounting by reading data and creating draft documents through a secure OAuth-protected interface. It exposes 37 tools, such as list_items, get_item, list_customers.
Summary generated from the project's README
About Enterich MCP server
Interacting with ERPNext accounting data and preparing draft documents from an AI client is what Enterich enables. This MCP server acts as a separate service that connects to the ERPNext REST API using a dedicated agent user. It functions as a resource server for the MCP authorization spec, requiring tokens from an external authorization server like Keycloak to manage access.
Developers use this server to perform specific accounting tasks across several domains, including order to cash, procure to pay, and record to report. It provides a fixed set of 37 tools, such as list_items, report_accounts_receivable, and create_draft_sales_invoice. Unlike a general API bridge, it does not allow generic document access or method calls. It is strictly limited to reading data and creating drafts; it cannot submit, cancel, or delete any documents in ERPNext. This ensures that a human must always review and submit the drafts prepared by the agent.
Written from the project's README. Every use case is checked against a quote from it.
How to install Enterich MCP
Formats verified 10 Nov 2026Install Enterich MCP in Claude Code
$ claude mcp add --env ENTERICH_ERPNEXT_API_KEY=<YOUR_ENTERICH_ERPNEXT_API_KEY> --env ENTERICH_ERPNEXT_API_SECRET=<YOUR_ENTERICH_ERPNEXT_API_SECRET> --env ENTERICH_CLIENT_ID=<ENTERICH_CLIENT_ID> --env ENTERICH_COMPANY=<ENTERICH_COMPANY> --env ENTERICH_ERPNEXT_PUBLIC_URL=<ENTERICH_ERPNEXT_PUBLIC_URL> --env ENTERICH_ERPNEXT_URL=<ENTERICH_ERPNEXT_URL> --env ENTERICH_ISSUER=<ENTERICH_ISSUER> --env ENTERICH_JWKS_URL=<ENTERICH_JWKS_URL> --env ENTERICH_RESOURCE_URL=<ENTERICH_RESOURCE_URL> --env ENTERICH_SUBJECT=<ENTERICH_SUBJECT> enterich -- docker run -i --rm ghcr.io/interlusion/enterich:0.5.0Install Enterich MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"enterich": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/interlusion/enterich:0.5.0"
],
"env": {
"ENTERICH_ERPNEXT_API_KEY": "<YOUR_ENTERICH_ERPNEXT_API_KEY>",
"ENTERICH_ERPNEXT_API_SECRET": "<YOUR_ENTERICH_ERPNEXT_API_SECRET>",
"ENTERICH_CLIENT_ID": "<ENTERICH_CLIENT_ID>",
"ENTERICH_COMPANY": "<ENTERICH_COMPANY>",
"ENTERICH_ERPNEXT_PUBLIC_URL": "<ENTERICH_ERPNEXT_PUBLIC_URL>",
"ENTERICH_ERPNEXT_URL": "<ENTERICH_ERPNEXT_URL>",
"ENTERICH_ISSUER": "<ENTERICH_ISSUER>",
"ENTERICH_JWKS_URL": "<ENTERICH_JWKS_URL>",
"ENTERICH_RESOURCE_URL": "<ENTERICH_RESOURCE_URL>",
"ENTERICH_SUBJECT": "<ENTERICH_SUBJECT>"
}
}
}
}Install Enterich MCP in VS Code
.vscode/mcp.json
{
"servers": {
"enterich": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/interlusion/enterich:0.5.0"
],
"env": {
"ENTERICH_ERPNEXT_API_KEY": "<YOUR_ENTERICH_ERPNEXT_API_KEY>",
"ENTERICH_ERPNEXT_API_SECRET": "<YOUR_ENTERICH_ERPNEXT_API_SECRET>",
"ENTERICH_CLIENT_ID": "<ENTERICH_CLIENT_ID>",
"ENTERICH_COMPANY": "<ENTERICH_COMPANY>",
"ENTERICH_ERPNEXT_PUBLIC_URL": "<ENTERICH_ERPNEXT_PUBLIC_URL>",
"ENTERICH_ERPNEXT_URL": "<ENTERICH_ERPNEXT_URL>",
"ENTERICH_ISSUER": "<ENTERICH_ISSUER>",
"ENTERICH_JWKS_URL": "<ENTERICH_JWKS_URL>",
"ENTERICH_RESOURCE_URL": "<ENTERICH_RESOURCE_URL>",
"ENTERICH_SUBJECT": "<ENTERICH_SUBJECT>"
}
}
}
}Install Enterich MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"enterich": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/interlusion/enterich:0.5.0"
],
"env": {
"ENTERICH_ERPNEXT_API_KEY": "<YOUR_ENTERICH_ERPNEXT_API_KEY>",
"ENTERICH_ERPNEXT_API_SECRET": "<YOUR_ENTERICH_ERPNEXT_API_SECRET>",
"ENTERICH_CLIENT_ID": "<ENTERICH_CLIENT_ID>",
"ENTERICH_COMPANY": "<ENTERICH_COMPANY>",
"ENTERICH_ERPNEXT_PUBLIC_URL": "<ENTERICH_ERPNEXT_PUBLIC_URL>",
"ENTERICH_ERPNEXT_URL": "<ENTERICH_ERPNEXT_URL>",
"ENTERICH_ISSUER": "<ENTERICH_ISSUER>",
"ENTERICH_JWKS_URL": "<ENTERICH_JWKS_URL>",
"ENTERICH_RESOURCE_URL": "<ENTERICH_RESOURCE_URL>",
"ENTERICH_SUBJECT": "<ENTERICH_SUBJECT>"
}
}
}
}Install Enterich MCP in Codex
~/.codex/config.toml
[mcp_servers.enterich] command = "docker" args = ["run", "-i", "--rm", "ghcr.io/interlusion/enterich:0.5.0"] [mcp_servers.enterich.env] ENTERICH_ERPNEXT_API_KEY = "<YOUR_ENTERICH_ERPNEXT_API_KEY>" ENTERICH_ERPNEXT_API_SECRET = "<YOUR_ENTERICH_ERPNEXT_API_SECRET>" ENTERICH_CLIENT_ID = "<ENTERICH_CLIENT_ID>" ENTERICH_COMPANY = "<ENTERICH_COMPANY>" ENTERICH_ERPNEXT_PUBLIC_URL = "<ENTERICH_ERPNEXT_PUBLIC_URL>" ENTERICH_ERPNEXT_URL = "<ENTERICH_ERPNEXT_URL>" ENTERICH_ISSUER = "<ENTERICH_ISSUER>" ENTERICH_JWKS_URL = "<ENTERICH_JWKS_URL>" ENTERICH_RESOURCE_URL = "<ENTERICH_RESOURCE_URL>" ENTERICH_SUBJECT = "<ENTERICH_SUBJECT>"
Install Enterich MCP in Gemini CLI
~/.gemini/settings.json
{
"mcpServers": {
"enterich": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/interlusion/enterich:0.5.0"
],
"env": {
"ENTERICH_ERPNEXT_API_KEY": "<YOUR_ENTERICH_ERPNEXT_API_KEY>",
"ENTERICH_ERPNEXT_API_SECRET": "<YOUR_ENTERICH_ERPNEXT_API_SECRET>",
"ENTERICH_CLIENT_ID": "<ENTERICH_CLIENT_ID>",
"ENTERICH_COMPANY": "<ENTERICH_COMPANY>",
"ENTERICH_ERPNEXT_PUBLIC_URL": "<ENTERICH_ERPNEXT_PUBLIC_URL>",
"ENTERICH_ERPNEXT_URL": "<ENTERICH_ERPNEXT_URL>",
"ENTERICH_ISSUER": "<ENTERICH_ISSUER>",
"ENTERICH_JWKS_URL": "<ENTERICH_JWKS_URL>",
"ENTERICH_RESOURCE_URL": "<ENTERICH_RESOURCE_URL>",
"ENTERICH_SUBJECT": "<ENTERICH_SUBJECT>"
}
}
}
}Enterich MCP tools 37
Detected from the READMElist_itemsget_itemlist_customersget_customerlist_sales_invoicesget_sales_invoicelist_sales_tax_templatesreport_accounts_receivablecreate_draft_sales_invoiceupdate_draft_sales_invoicecreate_draft_sales_returnupdate_draft_sales_return
| list_items | — | |
| get_item | — | |
| list_customers | — | |
| get_customer | — | |
| list_sales_invoices | — | |
| get_sales_invoice | — | |
| list_sales_tax_templates | — | |
| report_accounts_receivable | — | |
| create_draft_sales_invoice | — | |
| update_draft_sales_invoice | — | |
| create_draft_sales_return | — | |
| update_draft_sales_return | — |
Show all 37 toolsShow fewer tools
list_suppliersget_supplierlist_purchase_invoicesget_purchase_invoicelist_purchase_tax_templatesreport_accounts_payablecreate_draft_purchase_invoiceupdate_draft_purchase_invoicecreate_draft_purchase_returnupdate_draft_purchase_returnlist_accountslist_cost_centerslist_journal_entriesget_journal_entryreport_general_ledgerreport_trial_balancecreate_draft_journal_entryupdate_draft_journal_entrylist_bank_accountslist_bank_transactionsget_bank_transactionlist_payment_entriesget_payment_entrycreate_draft_payment_entryupdate_draft_payment_entry
| list_suppliers | — | |
| get_supplier | — | |
| list_purchase_invoices | — | |
| get_purchase_invoice | — | |
| list_purchase_tax_templates | — | |
| report_accounts_payable | — | |
| create_draft_purchase_invoice | — | |
| update_draft_purchase_invoice | — | |
| create_draft_purchase_return | — | |
| update_draft_purchase_return | — | |
| list_accounts | — | |
| list_cost_centers | — | |
| list_journal_entries | — | |
| get_journal_entry | — | |
| report_general_ledger | — | |
| report_trial_balance | — | |
| create_draft_journal_entry | — | |
| update_draft_journal_entry | — | |
| list_bank_accounts | — | |
| list_bank_transactions | — | |
| get_bank_transaction | — | |
| list_payment_entries | — | |
| get_payment_entry | — | |
| create_draft_payment_entry | — | |
| update_draft_payment_entry | — |
Configuration
ENTERICH_ERPNEXT_API_KEYRequiredSecretThe ERPNext agent user's API key
ENTERICH_ERPNEXT_API_SECRETRequiredSecretThe ERPNext agent user's API secret
ENTERICH_CLIENT_IDRequiredThe OAuth client the agent's tokens are issued to
ENTERICH_COMPANYRequiredThe assigned company, exactly as named in ERPNext
ENTERICH_ERPNEXT_PUBLIC_URLRequiredThe base URL people open ERPNext at, for links in results
ENTERICH_ERPNEXT_URLRequiredThe base URL Enterich calls ERPNext at
ENTERICH_ISSUERRequiredThe authorization server's issuer, https
ENTERICH_JWKS_URLRequiredThe authorization server's signing keys, https
ENTERICH_RESOURCE_URLRequiredThe MCP endpoint exactly as clients enter it, https; its path is the one served
ENTERICH_SUBJECTRequiredThe agent identity's sub
ENTERICH_CLOCK_LEEWAYSeconds of clock leeway for token times, 0 to 60
ENTERICH_ERPNEXT_HOSTThe Host header sent to ERPNext, by default the URL's host
ENTERICH_HOSTThe listen address
ENTERICH_LOG_LEVELThe level for libraries' log lines: DEBUG, INFO, WARNING or ERROR
ENTERICH_MAX_DRAFTS_PER_HOURMost drafts of each type the agent may create in an hour; unset, no limit
ENTERICH_PORTThe listen port
ENTERICH_REQUIRED_SCOPESScopes required in the token, space-separated
ENTERICH_TIMEZONEIANA time zone for today's date, the ERPNext site's
ENTERICH_TOKEN_ALGORITHMSToken signing algorithms accepted, comma-separated
ENTERICH_TOOLSThe operations to offer, comma-separated; by default all
| Name | Description | |
|---|---|---|
| ENTERICH_ERPNEXT_API_KEY | The ERPNext agent user's API key | RequiredSecret |
| ENTERICH_ERPNEXT_API_SECRET | The ERPNext agent user's API secret | RequiredSecret |
| ENTERICH_CLIENT_ID | The OAuth client the agent's tokens are issued to | Required |
| ENTERICH_COMPANY | The assigned company, exactly as named in ERPNext | Required |
| ENTERICH_ERPNEXT_PUBLIC_URL | The base URL people open ERPNext at, for links in results | Required |
| ENTERICH_ERPNEXT_URL | The base URL Enterich calls ERPNext at | Required |
| ENTERICH_ISSUER | The authorization server's issuer, https | Required |
| ENTERICH_JWKS_URL | The authorization server's signing keys, https | Required |
| ENTERICH_RESOURCE_URL | The MCP endpoint exactly as clients enter it, https; its path is the one served | Required |
| ENTERICH_SUBJECT | The agent identity's sub | Required |
| ENTERICH_CLOCK_LEEWAY | Seconds of clock leeway for token times, 0 to 60 | |
| ENTERICH_ERPNEXT_HOST | The Host header sent to ERPNext, by default the URL's host | |
| ENTERICH_HOST | The listen address | |
| ENTERICH_LOG_LEVEL | The level for libraries' log lines: DEBUG, INFO, WARNING or ERROR | |
| ENTERICH_MAX_DRAFTS_PER_HOUR | Most drafts of each type the agent may create in an hour; unset, no limit | |
| ENTERICH_PORT | The listen port | |
| ENTERICH_REQUIRED_SCOPES | Scopes required in the token, space-separated | |
| ENTERICH_TIMEZONE | IANA time zone for today's date, the ERPNext site's | |
| ENTERICH_TOKEN_ALGORITHMS | Token signing algorithms accepted, comma-separated | |
| ENTERICH_TOOLS | The operations to offer, comma-separated; by default all |
Automated checks
Ran Nov 12, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablePass
- Open source license (OSI)Pass
- Commit or release in the last yearPass
- Package name not close to a popular packageNot checked
- Remote endpoint uses HTTPSNot checked
- Destructive tools are labelledPass
- No hidden instructions to the modelPass
- No critical advisory in the package or its dependenciesNot checked
README
View on GitHubAn MCP server for ERPNext with hard limits: a short, fixed list of tools, tokens from an external OAuth authorization server, and only the rights of one ERPNext user.
Status: Every operation is tested against a model of ERPNext v16's API, and weekly against a real ERPNext v16 site. The changelog lists the releases.
What it is
- A separate service, not a Frappe app. It calls ERPNext's REST API with the API key of a dedicated agent user and holds no other ERPNext credential. Whatever the service does, ERPNext's role for that user is the upper limit.
- A resource server for the MCP authorization spec. It serves the protected resource metadata, answers a missing token with 401, and checks every access token itself (issuer, audience, client, subject). Sign-in happens at an external authorization server such as Keycloak.
- A fixed list of operations, each with its own purpose and input schema, read and write separated. No generic document access, method calls or file access.
- Client-neutral. It speaks plain MCP (Streamable HTTP) and doesn't rely on any client asking before a write.
What it is not
- Not a general ERPNext API bridge: tools that take a DocType, report name, method name, field list, filter expression or file path as input are out of scope.
- Not a way to post: no tool submits, cancels, amends, deletes or discards a document. The agent prepares drafts; a person reviews and submits them in ERPNext (reviewing drafts).
- Not affiliated with or endorsed by Frappe Technologies. ERPNext and Frappe are their trademarks.
Tools
Enterich offers 37 tools. A deployment may offer fewer (ENTERICH_TOOLS); every tool works on one company, within the rights ERPNext gives the agent user.
Master data (REQ-003)
Items.
| Tool | Title | Kind |
|---|---|---|
list_items |
List items | read |
get_item |
Get item | read |
Order to cash (REQ-004)
Customers, sales invoices, receivables.
| Tool | Title | Kind |
|---|---|---|
list_customers |
List customers | read |
get_customer |
Get customer | read |
list_sales_invoices |
List sales invoices | read |
get_sales_invoice |
Get sales invoice | read |
list_sales_tax_templates |
List sales tax templates | read |
report_accounts_receivable |
Accounts receivable | read |
create_draft_sales_invoice |
Create draft sales invoice | create draft |
update_draft_sales_invoice |
Update draft sales invoice | update draft |
create_draft_sales_return |
Create draft sales return | create draft |
update_draft_sales_return |
Update draft sales return | update draft |
Procure to pay (REQ-005)
Suppliers, purchase invoices, payables.
| Tool | Title | Kind |
|---|---|---|
list_suppliers |
List suppliers | read |
get_supplier |
Get supplier | read |
list_purchase_invoices |
List purchase invoices | read |
get_purchase_invoice |
Get purchase invoice | read |
list_purchase_tax_templates |
List purchase tax templates | read |
report_accounts_payable |
Accounts payable | read |
create_draft_purchase_invoice |
Create draft purchase invoice | create draft |
update_draft_purchase_invoice |
Update draft purchase invoice | update draft |
create_draft_purchase_return |
Create draft purchase return | create draft |
update_draft_purchase_return |
Update draft purchase return | update draft |
Record to report (REQ-006)
Accounts, cost centres, journal entries, ledger, trial balance.
| Tool | Title | Kind |
|---|---|---|
list_accounts |
List accounts | read |
list_cost_centers |
List cost centres | read |
list_journal_entries |
List journal entries | read |
get_journal_entry |
Get journal entry | read |
report_general_ledger |
General ledger | read |
report_trial_balance |
Trial balance | read |
create_draft_journal_entry |
Create draft journal entry | create draft |
update_draft_journal_entry |
Update draft journal entry | update draft |
Bank and cash (REQ-007)
Bank accounts, bank transactions, payments.
| Tool | Title | Kind |
|---|---|---|
list_bank_accounts |
List bank accounts | read |
list_bank_transactions |
List bank transactions | read |
get_bank_transaction |
Get bank transaction | read |
list_payment_entries |
List payment entries | read |
get_payment_entry |
Get payment entry | read |
create_draft_payment_entry |
Create draft payment entry | create draft |
update_draft_payment_entry |
Update draft payment entry | update draft |
Scope
Enterich is maintained for our own use. Contributions are welcome (contributing); support isn't promised. Report vulnerabilities privately, as the security policy describes.
Documentation
Start at docs/README.md. The most important parts:
- Requirement specifications: the core, and the operations by accounting area
- Architecture and decisions
- Configuration
Licence
Apache-2.0. Why: ADR-006.
Enterich MCP questions
How do I add Enterich MCP to Claude Code?
Run claude mcp add --env ENTERICH_ERPNEXT_API_KEY=<YOUR_ENTERICH_ERPNEXT_API_KEY> --env ENTERICH_ERPNEXT_API_SECRET=<YOUR_ENTERICH_ERPNEXT_API_SECRET> --env ENTERICH_CLIENT_ID=<ENTERICH_CLIENT_ID> --env ENTERICH_COMPANY=<ENTERICH_COMPANY> --env ENTERICH_ERPNEXT_PUBLIC_URL=<ENTERICH_ERPNEXT_PUBLIC_URL> --env ENTERICH_ERPNEXT_URL=<ENTERICH_ERPNEXT_URL> --env ENTERICH_ISSUER=<ENTERICH_ISSUER> --env ENTERICH_JWKS_URL=<ENTERICH_JWKS_URL> --env ENTERICH_RESOURCE_URL=<ENTERICH_RESOURCE_URL> --env ENTERICH_SUBJECT=<ENTERICH_SUBJECT> enterich -- docker run -i --rm ghcr.io/interlusion/enterich:0.5.0 in your terminal. Add --scope user to make it available in every project.
How do I add Enterich MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does Enterich MCP provide?
It exposes 37 tools, including list_items, get_item, list_customers, get_customer, list_sales_invoices.
Can the server submit or delete documents in ERPNext?
No, the server only prepares drafts. A human must review and submit them within ERPNext.
How does authentication work with Enterich?
It uses tokens from an external OAuth authorization server, such as Keycloak, to verify access.