beeswax-mcp 0.1.0 → 0.2.0

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.
package/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  The official [Model Context Protocol](https://modelcontextprotocol.io) server for
4
4
  [Beeswax](https://www.beeswaxapp.com) — projects, tasks, time tracking and accounting
5
5
  for creative businesses. It lets Claude and other MCP clients query your invoices,
6
- quotes, expenses, payments, journals, time entries, milestones and tax returns.
6
+ quotes, expenses, payments, journals, time entries, milestones, products & services
7
+ and tax returns.
7
8
 
8
9
  It is **read-mostly**: writes are limited to manual journals and tax-return fields,
9
10
  and each write is gated behind its own token scope — everything else is strictly
@@ -51,7 +52,7 @@ account.
51
52
  **Grant only the scopes you need.** Tick individual read scopes
52
53
  (`invoices:read`, `payments:read`, `transactions:read`, `journal_entries:read`,
53
54
  `tax_returns:read`, `events:read`, `milestones:read`, `projects:read`,
54
- `time_entries:read`, …) rather than `all` — `all` grants read **and** write. Add
55
+ `time_entries:read`, `transaction_templates:read`, …) rather than `all` — `all` grants read **and** write. Add
55
56
  `journal_entries:write` / `tax_returns:write` only if the agent should be able to
56
57
  use the write tools.
57
58
 
@@ -79,6 +80,7 @@ longer use from the same settings page.
79
80
  | `list_events`, `get_event` | `/events` (visibility-filtered) |
80
81
  | `list_milestones`, `get_milestone` | `/milestones` |
81
82
  | `get_project` | `/active_account/projects/:id` |
83
+ | `list_products_services`, `get_product_service` | `/transaction_templates` |
82
84
  | `list_manual_journals`, `get_manual_journal`, `create_manual_journal` (write), `finalise_manual_journal` (write) | `/raw_journal_entries` |
83
85
  | `list_tax_returns`, `get_tax_return`, `get_tax_return_field_transactions`, `list_tax_return_findings`, `update_tax_return_field` (write), `confirm_tax_return_section` (write) | `/tax_returns` |
84
86
 
@@ -95,6 +97,10 @@ longer use from the same settings page.
95
97
  fetches. `outstanding: true` is the looser "not paid/draft, any due date" set.
96
98
  - **Dates.** `from` / `to` accept ISO (`2026-01-01`) or loose strings
97
99
  (`Jan 1 2026`); they are normalized to `YYYY-MM-DD` before being sent.
100
+ - **Products & services.** Beeswax stores the catalogue as *transaction
101
+ templates*; the tools filter with `kind: "product"` / `"service"` and need the
102
+ `transaction_templates:read` scope. Internal system templates are excluded
103
+ unless `system: "true"`.
98
104
  - **Manual journals.** Balanced double-entry enforced by the API (≥ 2 lines, one of
99
105
  debit/credit per line, debits = credits). Created finalised by default; pass
100
106
  `status: "draft"` and use `finalise_manual_journal` for a review step. Needs
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ if (!token) {
14
14
  }
15
15
  const client = new BeeswaxClient(baseUrl, token);
16
16
  const toolsByName = new Map(TOOLS.map((tool) => [tool.name, tool]));
17
- const server = new Server({ name: "beeswax-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
17
+ const server = new Server({ name: "beeswax-mcp", version: "0.2.0" }, { capabilities: { tools: {} } });
18
18
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
19
19
  tools: TOOLS.map(({ name, description, inputSchema }) => ({ name, description, inputSchema })),
20
20
  }));
package/dist/tools.js CHANGED
@@ -16,6 +16,8 @@ const DATE_PROPS = {
16
16
  const ACCOUNTING_LIST_PROPS = {
17
17
  state: { type: "string", description: "Filter by state (draft, finalised, pdf_sent, partial_paid, paid, …)." },
18
18
  project_id: { type: "integer", description: "Filter to a single project." },
19
+ company_id: { type: "integer", description: "Filter to a single client/supplier company by id." },
20
+ company: { type: "string", description: "Filter by client/supplier company name (case-insensitive substring match)." },
19
21
  ...DATE_PROPS,
20
22
  };
21
23
  // Only the payable types (invoices / expenses) carry a due date, so the
@@ -44,6 +46,8 @@ function accountingTools(resource, singular, label, listName, opts = {}) {
44
46
  handler: (client, args) => client.fetchAll(`/${resource}`, resource, {
45
47
  state: args.state,
46
48
  project_id: args.project_id,
49
+ company_id: args.company_id,
50
+ company: args.company,
47
51
  from: normalizeDate(args.from),
48
52
  to: normalizeDate(args.to),
49
53
  ...(payable ? { overdue: args.overdue, outstanding: args.outstanding } : {}),
@@ -156,6 +160,40 @@ export const TOOLS = [
156
160
  inputSchema: { type: "object", properties: { id: { type: "integer" } }, required: ["id"] },
157
161
  handler: (client, args) => client.getOne(`/active_account/projects/${args.id}`, "project"),
158
162
  },
163
+ // ── Products & services catalogue (transaction templates) ──────────────
164
+ {
165
+ name: "list_products_services",
166
+ description: "List the account's products & services catalogue (stored as 'transaction templates'): everything the business sells or buys as a line item — products and services/activities with their unit, sell/buy prices, linked income/expense accounts and taxes. Use this whenever the user asks about products, services, price lists, rates or catalogue items.",
167
+ inputSchema: {
168
+ type: "object",
169
+ properties: {
170
+ kind: {
171
+ type: "string",
172
+ enum: ["product", "service"],
173
+ description: "Only products, or only services/activities. Omit for both.",
174
+ },
175
+ active: { type: "boolean", description: "Filter by active flag (false = archived items)." },
176
+ query: { type: "string", description: "Case-insensitive substring match on title or description." },
177
+ system: {
178
+ type: "string",
179
+ enum: ["true", "false"],
180
+ description: "true = only internal system templates; false or omitted = only user-created catalogue items.",
181
+ },
182
+ },
183
+ },
184
+ handler: (client, args) => client.fetchAll("/transaction_templates", "transaction_templates", {
185
+ kind: args.kind,
186
+ active: args.active,
187
+ query: args.query,
188
+ system: args.system,
189
+ }),
190
+ },
191
+ {
192
+ name: "get_product_service",
193
+ description: "Get a single product or service (transaction template) by id, with its unit, sell/buy prices, item category, linked accounts and taxes.",
194
+ inputSchema: { type: "object", properties: { id: { type: "integer" } }, required: ["id"] },
195
+ handler: (client, args) => client.getOne(`/transaction_templates/${args.id}`, "transaction_template"),
196
+ },
159
197
  // ── Tax returns (Australian company / sole-trader) ──────────────────
160
198
  {
161
199
  name: "list_tax_returns",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beeswax-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Official MCP server for Beeswax (beeswaxapp.com) — query invoices, quotes, expenses, payments, journals, time entries, projects and tax returns from Claude and other MCP clients.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://www.beeswaxapp.com/support/mcp-setup",
@@ -29,6 +29,7 @@
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsc",
32
+ "build:mcpb": "bash scripts/build-mcpb.sh",
32
33
  "start": "node dist/index.js",
33
34
  "dev": "tsc --watch",
34
35
  "prepublishOnly": "npm run build"