@casys/mcp-erpnext 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +381 -0
  2. package/package.json +1 -1
package/README.md ADDED
@@ -0,0 +1,381 @@
1
+ # @casys/mcp-erpnext
2
+
3
+ MCP server for [ERPNext](https://erpnext.com) / Frappe ERP — **120 tools** across **13 categories**, with **7 interactive UI viewers**.
4
+
5
+ Connect any MCP-compatible AI agent (Claude Desktop, PML, custom) to your ERPNext instance via the standard [Model Context Protocol](https://modelcontextprotocol.io).
6
+
7
+ ## Quick Start
8
+
9
+ ### Prerequisites
10
+
11
+ Generate API credentials in ERPNext:
12
+ 1. Login to ERPNext → top-right menu → **My Settings**
13
+ 2. Section **API Access** → **Generate Keys**
14
+ 3. Copy `API Key` and `API Secret`
15
+
16
+ ### Claude Desktop / Claude Code (npm)
17
+
18
+ ```json
19
+ {
20
+ "mcpServers": {
21
+ "erpnext": {
22
+ "command": "npx",
23
+ "args": ["-y", "@casys/mcp-erpnext"],
24
+ "env": {
25
+ "ERPNEXT_URL": "http://localhost:8000",
26
+ "ERPNEXT_API_KEY": "your-api-key",
27
+ "ERPNEXT_API_SECRET": "your-api-secret"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ > Zero dependencies — single self-contained bundle. Requires Node >= 20.
35
+
36
+ ### Deno (stdio)
37
+
38
+ ```json
39
+ {
40
+ "mcpServers": {
41
+ "erpnext": {
42
+ "command": "deno",
43
+ "args": ["run", "--allow-all", "server.ts"],
44
+ "env": {
45
+ "ERPNEXT_URL": "http://localhost:8000",
46
+ "ERPNEXT_API_KEY": "your-api-key",
47
+ "ERPNEXT_API_SECRET": "your-api-secret"
48
+ }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### HTTP mode
55
+
56
+ ```bash
57
+ ERPNEXT_URL=http://localhost:8000 \
58
+ ERPNEXT_API_KEY=xxx \
59
+ ERPNEXT_API_SECRET=xxx \
60
+ npx -y @casys/mcp-erpnext --http --port=3012
61
+ ```
62
+
63
+ ### Category filtering
64
+
65
+ Load only the categories you need:
66
+
67
+ ```bash
68
+ npx -y @casys/mcp-erpnext --categories=sales,inventory
69
+ ```
70
+
71
+ ## Fresh Instance Setup
72
+
73
+ On a fresh ERPNext instance (no setup wizard), you need to create master data before using business tools. Use `erpnext_doc_create` for prerequisites:
74
+
75
+ ```
76
+ 1. Warehouse Types: Transit, Default
77
+ 2. UOMs: Nos, Kg, Unit, Set, Meter
78
+ 3. Item Groups: All Item Groups (is_group=1), then Products, Raw Material (parent=All Item Groups)
79
+ 4. Territories: All Territories (is_group=1), then France, etc.
80
+ 5. Customer Groups: All Customer Groups (is_group=1), then Commercial, etc.
81
+ 6. Supplier Groups: All Supplier Groups (is_group=1), then Hardware, etc.
82
+ 7. Company: requires Warehouse Types to exist first
83
+ ```
84
+
85
+ ## Tools (120)
86
+
87
+ ### Setup (2)
88
+
89
+ | Tool | DocType | Operations |
90
+ |------|---------|-----------|
91
+ | `erpnext_company_list` | Company | List companies |
92
+ | `erpnext_company_create` | Company | Create (name, abbr, currency, country, domain) |
93
+
94
+ ### Sales (17)
95
+
96
+ | Tool | DocType | Operations |
97
+ |------|---------|-----------|
98
+ | `erpnext_customer_list` | Customer | List + filters (group, territory, disabled) |
99
+ | `erpnext_customer_get` | Customer | Get by name |
100
+ | `erpnext_customer_create` | Customer | Create (name, group, territory, email, type) |
101
+ | `erpnext_customer_update` | Customer | Update fields |
102
+ | `erpnext_sales_order_list` | Sales Order | List + filters (customer, status, dates) |
103
+ | `erpnext_sales_order_get` | Sales Order | Get with line items |
104
+ | `erpnext_sales_order_create` | Sales Order | Create (customer + items + delivery_date) |
105
+ | `erpnext_sales_order_update` | Sales Order | Update (delivery_date, items) |
106
+ | `erpnext_sales_order_submit` | Sales Order | Submit (Draft → To Deliver and Bill) |
107
+ | `erpnext_sales_order_cancel` | Sales Order | Cancel |
108
+ | `erpnext_sales_invoice_list` | Sales Invoice | List + filters |
109
+ | `erpnext_sales_invoice_get` | Sales Invoice | Get with line items |
110
+ | `erpnext_sales_invoice_create` | Sales Invoice | Create (customer + items + dates) |
111
+ | `erpnext_sales_invoice_submit` | Sales Invoice | Submit (Draft → Unpaid) |
112
+ | `erpnext_quotation_list` | Quotation | List + filters (party, status) |
113
+ | `erpnext_quotation_get` | Quotation | Get with line items |
114
+ | `erpnext_quotation_create` | Quotation | Create (Customer/Lead + items) |
115
+
116
+ ### Inventory (9)
117
+
118
+ | Tool | DocType | Operations |
119
+ |------|---------|-----------|
120
+ | `erpnext_item_list` | Item | List + filters (group, stock flag, disabled) |
121
+ | `erpnext_item_get` | Item | Get by name/code |
122
+ | `erpnext_item_create` | Item | Create (code, name, group, uom, rate) |
123
+ | `erpnext_item_update` | Item | Update fields |
124
+ | `erpnext_stock_balance` | Bin | Stock balances by item/warehouse |
125
+ | `erpnext_warehouse_list` | Warehouse | List + filters (company, type) |
126
+ | `erpnext_stock_entry_list` | Stock Entry | List + filters (type, dates) |
127
+ | `erpnext_stock_entry_get` | Stock Entry | Get with item details |
128
+ | `erpnext_stock_entry_create` | Stock Entry | Create (type + items + warehouses) |
129
+
130
+ ### Purchasing (11)
131
+
132
+ | Tool | DocType | Operations |
133
+ |------|---------|-----------|
134
+ | `erpnext_supplier_list` | Supplier | List + filters (group, type, disabled) |
135
+ | `erpnext_supplier_get` | Supplier | Get by name |
136
+ | `erpnext_supplier_create` | Supplier | Create (name, group, type, country, currency) |
137
+ | `erpnext_purchase_order_list` | Purchase Order | List + filters (supplier, status, dates) |
138
+ | `erpnext_purchase_order_get` | Purchase Order | Get with line items |
139
+ | `erpnext_purchase_order_create` | Purchase Order | Create (supplier + items + schedule_date) |
140
+ | `erpnext_purchase_invoice_list` | Purchase Invoice | List + filters |
141
+ | `erpnext_purchase_invoice_get` | Purchase Invoice | Get with line items |
142
+ | `erpnext_purchase_receipt_list` | Purchase Receipt | List + filters |
143
+ | `erpnext_purchase_receipt_get` | Purchase Receipt | Get with received items |
144
+ | `erpnext_supplier_quotation_list` | Supplier Quotation | List + filters |
145
+
146
+ ### Accounting (6)
147
+
148
+ | Tool | DocType | Operations |
149
+ |------|---------|-----------|
150
+ | `erpnext_account_list` | Account | Chart of accounts + filters (root_type, is_group) |
151
+ | `erpnext_journal_entry_list` | Journal Entry | List + filters (voucher_type, dates) |
152
+ | `erpnext_journal_entry_get` | Journal Entry | Get with accounts |
153
+ | `erpnext_journal_entry_create` | Journal Entry | Create (voucher_type + balanced accounts) |
154
+ | `erpnext_payment_entry_list` | Payment Entry | List + filters (type, party, dates) |
155
+ | `erpnext_payment_entry_get` | Payment Entry | Get with references |
156
+
157
+ ### HR (12)
158
+
159
+ | Tool | DocType | Operations |
160
+ |------|---------|-----------|
161
+ | `erpnext_employee_list` | Employee | List + filters (department, status, company) |
162
+ | `erpnext_employee_get` | Employee | Get by ID |
163
+ | `erpnext_attendance_list` | Attendance | List + filters (employee, status, dates) |
164
+ | `erpnext_leave_application_list` | Leave Application | List + filters |
165
+ | `erpnext_leave_application_get` | Leave Application | Get by name |
166
+ | `erpnext_leave_application_create` | Leave Application | Create (employee, type, dates, reason) |
167
+ | `erpnext_salary_slip_list` | Salary Slip | List + filters (employee, status, dates) |
168
+ | `erpnext_salary_slip_get` | Salary Slip | Get with earnings/deductions |
169
+ | `erpnext_payroll_entry_list` | Payroll Entry | List + filters (company, status) |
170
+ | `erpnext_expense_claim_list` | Expense Claim | List + filters |
171
+ | `erpnext_expense_claim_create` | Expense Claim | Create (employee + expenses[]) |
172
+ | `erpnext_leave_balance` | Leave Allocation | Get allocations by employee |
173
+
174
+ ### Project (9)
175
+
176
+ | Tool | DocType | Operations |
177
+ |------|---------|-----------|
178
+ | `erpnext_project_list` | Project | List + filters (status, company) |
179
+ | `erpnext_project_get` | Project | Get by name |
180
+ | `erpnext_project_create` | Project | Create (name, status, dates, budget, company) |
181
+ | `erpnext_task_list` | Task | List + filters (project, status, priority) |
182
+ | `erpnext_task_get` | Task | Get with dependencies |
183
+ | `erpnext_task_create` | Task | Create (project, subject, status, priority, dates) |
184
+ | `erpnext_task_update` | Task | Update (status, priority, progress, dates) |
185
+ | `erpnext_timesheet_list` | Timesheet | List + filters (employee, project, status) |
186
+ | `erpnext_timesheet_get` | Timesheet | Get with time log details |
187
+
188
+ ### Delivery (5)
189
+
190
+ | Tool | DocType | Operations |
191
+ |------|---------|-----------|
192
+ | `erpnext_delivery_note_list` | Delivery Note | List + filters (customer, status, dates) |
193
+ | `erpnext_delivery_note_get` | Delivery Note | Get with delivered items |
194
+ | `erpnext_delivery_note_create` | Delivery Note | Create (customer + items + against_sales_order) |
195
+ | `erpnext_shipment_list` | Shipment | List + filters (status, carrier, dates) |
196
+ | `erpnext_shipment_get` | Shipment | Get with parcels |
197
+
198
+ ### Manufacturing (7)
199
+
200
+ | Tool | DocType | Operations |
201
+ |------|---------|-----------|
202
+ | `erpnext_bom_list` | BOM | List + filters (item, is_active, is_default) |
203
+ | `erpnext_bom_get` | BOM | Get with raw materials + operations |
204
+ | `erpnext_work_order_list` | Work Order | List + filters (production_item, status, dates) |
205
+ | `erpnext_work_order_get` | Work Order | Get with operations + materials |
206
+ | `erpnext_work_order_create` | Work Order | Create (production_item, bom_no, qty, dates) |
207
+ | `erpnext_job_card_list` | Job Card | List + filters (work_order, status, operation) |
208
+ | `erpnext_job_card_get` | Job Card | Get with time logs + material transfers |
209
+
210
+ ### CRM (8)
211
+
212
+ | Tool | DocType | Operations |
213
+ |------|---------|-----------|
214
+ | `erpnext_lead_list` | Lead | List + filters (status, lead_owner, source) |
215
+ | `erpnext_lead_get` | Lead | Get by name |
216
+ | `erpnext_lead_create` | Lead | Create (name, company, email, phone, source) |
217
+ | `erpnext_opportunity_list` | Opportunity | List + filters (status, owner, party) |
218
+ | `erpnext_opportunity_get` | Opportunity | Get with items + competitors |
219
+ | `erpnext_contact_list` | Contact | List + filters (company, status) |
220
+ | `erpnext_contact_get` | Contact | Get by name |
221
+ | `erpnext_campaign_list` | Campaign | List + filters (campaign_type) |
222
+
223
+ ### Assets (8)
224
+
225
+ | Tool | DocType | Operations |
226
+ |------|---------|-----------|
227
+ | `erpnext_asset_list` | Asset | List + filters (status, category, location) |
228
+ | `erpnext_asset_get` | Asset | Get with depreciation + maintenance |
229
+ | `erpnext_asset_create` | Asset | Create (name, category, company, purchase_date, cost) |
230
+ | `erpnext_asset_movement_list` | Asset Movement | List + filters (purpose, dates) |
231
+ | `erpnext_asset_movement_get` | Asset Movement | Get with assets moved |
232
+ | `erpnext_asset_maintenance_list` | Asset Maintenance | List + filters |
233
+ | `erpnext_asset_maintenance_get` | Asset Maintenance | Get with maintenance tasks |
234
+ | `erpnext_asset_category_list` | Asset Category | List all categories |
235
+
236
+ ### Generic Operations (7)
237
+
238
+ These tools work with **any** ERPNext DocType:
239
+
240
+ | Tool | Operation | Notes |
241
+ |------|-----------|-------|
242
+ | `erpnext_doc_create` | Create | Any DocType — essential for master data setup |
243
+ | `erpnext_doc_get` | Get | Any document by DocType + name |
244
+ | `erpnext_doc_list` | List | Any DocType with fields, filters, limit, order_by |
245
+ | `erpnext_doc_update` | Update | Partial patch — pass only fields to change |
246
+ | `erpnext_doc_delete` | Delete | Draft documents only |
247
+ | `erpnext_doc_submit` | Submit | Any submittable document |
248
+ | `erpnext_doc_cancel` | Cancel | Any submitted document |
249
+
250
+ ### Analytics (19)
251
+
252
+ Tools that return shaped data for chart, pipeline, KPI, and funnel viewers.
253
+
254
+ | Tool | Viewer | Description |
255
+ |------|--------|-------------|
256
+ | `erpnext_order_pipeline` | order-pipeline-viewer | Sales orders kanban by status |
257
+ | `erpnext_purchase_pipeline` | order-pipeline-viewer | Purchase orders kanban by status |
258
+ | `erpnext_stock_chart` | chart-viewer | Bar chart of stock levels by item/warehouse |
259
+ | `erpnext_sales_chart` | chart-viewer | Revenue by customer, item, or status (bar/donut) |
260
+ | `erpnext_revenue_trend` | chart-viewer | Monthly revenue trend (line/area, per customer) |
261
+ | `erpnext_order_breakdown` | chart-viewer | Orders by customer/status (stacked-bar/pie/donut) |
262
+ | `erpnext_revenue_vs_orders` | chart-viewer | Revenue bars + order count line (dual axis) |
263
+ | `erpnext_stock_treemap` | chart-viewer | Stock value treemap by item or warehouse |
264
+ | `erpnext_product_radar` | chart-viewer | Radar comparing items (stock, value, orders, revenue) |
265
+ | `erpnext_price_vs_qty` | chart-viewer | Scatter: selling price vs quantity ordered |
266
+ | `erpnext_ar_aging` | chart-viewer | AR aging buckets (0-30, 31-60, 61-90, 90+ days) |
267
+ | `erpnext_gross_profit` | chart-viewer | Revenue bars + margin % line by item/customer |
268
+ | `erpnext_profit_loss` | chart-viewer | P&L: income vs expenses per month + net profit |
269
+ | `erpnext_kpi_revenue` | kpi-viewer | Revenue MTD with delta vs previous month + sparkline |
270
+ | `erpnext_kpi_outstanding` | kpi-viewer | Outstanding receivables (count + total) |
271
+ | `erpnext_kpi_orders` | kpi-viewer | Orders this month with delta vs last month |
272
+ | `erpnext_kpi_gross_margin` | kpi-viewer | Gross margin % based on valuation rates |
273
+ | `erpnext_kpi_overdue` | kpi-viewer | Overdue invoices count + value |
274
+ | `erpnext_sales_funnel` | funnel-viewer | Lead → Opportunity → Quotation → Order funnel |
275
+
276
+ ## UI Viewers
277
+
278
+ Seven interactive [MCP Apps](https://github.com/anthropics/mcp-apps-sdk) viewers, registered as `ui://mcp-erpnext/{name}`:
279
+
280
+ | Viewer | Description |
281
+ |--------|-------------|
282
+ | `doclist-viewer` | Generic document table with sort, filter, pagination, CSV export |
283
+ | `invoice-viewer` | Single invoice display (header, items, totals, payment status) |
284
+ | `stock-viewer` | Stock balance table with color-coded qty badges |
285
+ | `chart-viewer` | Universal chart renderer (12 chart types via Recharts) |
286
+ | `order-pipeline-viewer` | Sales/Purchase Order kanban by status |
287
+ | `kpi-viewer` | Single metric card with delta, sparkline, trend indicator |
288
+ | `funnel-viewer` | Trapezoid sales funnel with conversion rates between stages |
289
+
290
+ ### Building UI viewers
291
+
292
+ ```bash
293
+ cd src/ui
294
+ npm install
295
+ node build-all.mjs
296
+ ```
297
+
298
+ ## npm Package
299
+
300
+ The npm package (`@casys/mcp-erpnext`) is a single self-contained bundle (1.3MB) with zero runtime dependencies. UI viewers are embedded.
301
+
302
+ To rebuild for npm from source:
303
+
304
+ ```bash
305
+ cd lib/erpnext
306
+ deno task ui:build # Build UI viewers
307
+ ./scripts/build-node.sh # Generate dist-node/
308
+ cd dist-node && npx esbuild server.ts --bundle --platform=node --target=node20 --format=esm --outfile=bin/mcp-erpnext.mjs --external:'node:*'
309
+ cd bin && npm publish --access public
310
+ ```
311
+
312
+ ## Environment Variables
313
+
314
+ | Variable | Required | Description |
315
+ |----------|----------|-------------|
316
+ | `ERPNEXT_URL` | Yes | ERPNext base URL (e.g. `http://localhost:8000`) |
317
+ | `ERPNEXT_API_KEY` | Yes | API Key from User Settings |
318
+ | `ERPNEXT_API_SECRET` | Yes | API Secret from User Settings |
319
+
320
+ ## Architecture
321
+
322
+ ```
323
+ mod.ts # Public API
324
+ server.ts # MCP server (stdio + HTTP)
325
+ deno.json # Package config
326
+ scripts/
327
+ build-node.sh # Node.js distribution builder
328
+ src/
329
+ api/
330
+ frappe-client.ts # Frappe REST HTTP client
331
+ types.ts # Type definitions
332
+ tools/
333
+ sales.ts # 17 sales tools
334
+ inventory.ts # 9 inventory tools
335
+ purchasing.ts # 11 purchasing tools
336
+ accounting.ts # 6 accounting tools
337
+ hr.ts # 12 HR tools
338
+ project.ts # 9 project tools
339
+ delivery.ts # 5 delivery tools
340
+ manufacturing.ts # 7 manufacturing tools
341
+ crm.ts # 8 CRM tools
342
+ assets.ts # 8 asset tools
343
+ operations.ts # 7 generic CRUD tools
344
+ setup.ts # 2 company/setup tools
345
+ analytics.ts # 19 analytics tools (charts, KPIs, pipelines, funnel)
346
+ mod.ts # Registry
347
+ types.ts # Tool interface
348
+ client.ts # ErpNextToolsClient
349
+ runtime.ts # Deno runtime shim
350
+ runtime.node.ts # Node.js runtime shim
351
+ ui/
352
+ doclist-viewer/ # Generic document list
353
+ invoice-viewer/ # Invoice display
354
+ stock-viewer/ # Stock balance display
355
+ chart-viewer/ # Universal chart renderer (Recharts)
356
+ order-pipeline-viewer/ # Kanban pipeline
357
+ kpi-viewer/ # Single metric card
358
+ funnel-viewer/ # Sales funnel
359
+ shared/ # Shared theme + branding
360
+ tests/
361
+ docs/
362
+ coverage.md # Full coverage matrix
363
+ ROADMAP.md # Viewer & analytics roadmap
364
+ ```
365
+
366
+ ## Development
367
+
368
+ ```bash
369
+ # Run tests
370
+ deno test --allow-all tests/
371
+
372
+ # Type check
373
+ deno check mod.ts server.ts
374
+
375
+ # Start HTTP server (dev)
376
+ deno task serve
377
+ ```
378
+
379
+ ## License
380
+
381
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casys/mcp-erpnext",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "MCP server for ERPNext — 120 tools for sales, inventory, accounting, HR, projects, analytics with interactive UI viewers",
5
5
  "type": "module",
6
6
  "bin": {