@hoagsmedia/frgur-mcp-server 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/CHANGELOG.md +12 -0
- package/README.md +46 -13
- package/index.mjs +8 -1
- package/package.json +8 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0 — 2026-07-02
|
|
4
|
+
|
|
5
|
+
- Document all **12** read-only books tools (was marketed as 3 in the npm description).
|
|
6
|
+
- Pin-friendly Settings wizard config: `@hoagsmedia/frugr-mcp@0.2.0` (legacy `@hoagsmedia/frgur-mcp-server@0.2.0` still works).
|
|
7
|
+
- Publish branding alias **`@hoagsmedia/frugr-mcp`** (same stdio bridge; `frugr-mcp` bin).
|
|
8
|
+
- **`@hoagsmedia/frgur-mcp-server`** remains supported; `FRGUR_API_TOKEN` / `FRGUR_API_URL` unchanged.
|
|
9
|
+
|
|
10
|
+
## 0.1.0 — 2026-06-23
|
|
11
|
+
|
|
12
|
+
- Initial npm publish (HOA-299): stdio MCP bridge to frugr read-only books tools.
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @hoagsmedia/frgur-mcp-server
|
|
2
2
|
|
|
3
|
+
> **Branding:** the preferred npm name is now [`@hoagsmedia/frugr-mcp`](https://www.npmjs.com/package/@hoagsmedia/frugr-mcp) — same package, same env vars. `@hoagsmedia/frgur-mcp-server` remains supported for existing configs.
|
|
4
|
+
|
|
3
5
|
A thin, **read-only** [MCP](https://modelcontextprotocol.io) bridge to your
|
|
4
6
|
[frugr](https://frgur.com) books. Point your own AI client — Cursor, Claude
|
|
5
7
|
Desktop, Claude Code, or any MCP-capable app — at your accounting data and ask
|
|
@@ -7,14 +9,23 @@ questions in plain language.
|
|
|
7
9
|
|
|
8
10
|
## What it does
|
|
9
11
|
|
|
10
|
-
It exposes
|
|
12
|
+
It exposes read-only tools over stdio and forwards each call to the frugr
|
|
11
13
|
API using your Personal Access Token:
|
|
12
14
|
|
|
13
|
-
| Tool
|
|
14
|
-
|
|
|
15
|
-
| `get_profit_loss`
|
|
16
|
-
| `search_transactions`
|
|
17
|
-
| `
|
|
15
|
+
| Tool | Returns |
|
|
16
|
+
| --------------------------------------- | ---------------------------------------------------------- |
|
|
17
|
+
| `get_profit_loss` | Income, expenses, net, and per-category totals for a year |
|
|
18
|
+
| `search_transactions` | Ledger transactions by text, date range, and/or category |
|
|
19
|
+
| `list_categories` | Chart-of-accounts category names and kinds |
|
|
20
|
+
| `summarize_transactions` | Transaction totals, rollups, and largest matching rows |
|
|
21
|
+
| `compare_periods` | Period-over-period transaction totals and counts |
|
|
22
|
+
| `compare_receipts_to_bank_transactions` | Receipt-backed rows vs matching bank rows |
|
|
23
|
+
| `get_open_invoices` | Outstanding receivables with balances by client |
|
|
24
|
+
| `get_open_bills` | Outstanding payables with due dates and vendor balances |
|
|
25
|
+
| `get_reconciliation_status` | Account reconciliation freshness and uncleared counts |
|
|
26
|
+
| `get_time_mileage_summary` | Billable time and mileage trip summaries |
|
|
27
|
+
| `get_business_snapshot` | Compact receivables, payables, spend, and cleanup snapshot |
|
|
28
|
+
| `find_bookkeeping_issues` | Uncategorized rows, missing receipts, and duplicates |
|
|
18
29
|
|
|
19
30
|
The bridge holds no credentials of its own, **never writes** to your books, and
|
|
20
31
|
runs **your** AI client's model under **your** subscription — frugr is only the
|
|
@@ -32,7 +43,7 @@ at any time.
|
|
|
32
43
|
"mcpServers": {
|
|
33
44
|
"frgur": {
|
|
34
45
|
"command": "npx",
|
|
35
|
-
"args": ["-y", "@hoagsmedia/
|
|
46
|
+
"args": ["-y", "@hoagsmedia/frugr-mcp@0.2.0"],
|
|
36
47
|
"env": {
|
|
37
48
|
"FRGUR_API_URL": "https://app.frgur.com",
|
|
38
49
|
"FRGUR_API_TOKEN": "frgur_pat_your_token_here"
|
|
@@ -48,6 +59,8 @@ at any time.
|
|
|
48
59
|
|
|
49
60
|
Requires Node.js 18+.
|
|
50
61
|
|
|
62
|
+
Prefer the **`frugr`** spelling? Use `@hoagsmedia/frugr-mcp@0.2.0` instead — identical bridge.
|
|
63
|
+
|
|
51
64
|
## Environment
|
|
52
65
|
|
|
53
66
|
| Variable | Required | Default | Notes |
|
|
@@ -72,12 +85,32 @@ curl -H "Authorization: Bearer frgur_pat_…" https://app.frgur.com/api/mcp
|
|
|
72
85
|
|
|
73
86
|
## Publishing (maintainers)
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
Packages (same `index.mjs`, publish both on release):
|
|
89
|
+
|
|
90
|
+
| npm name | Bin |
|
|
91
|
+
| ------------------------------ | ----------- |
|
|
92
|
+
| `@hoagsmedia/frugr-mcp` | `frugr-mcp` |
|
|
93
|
+
| `@hoagsmedia/frgur-mcp-server` | `frgur-mcp` |
|
|
76
94
|
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
Under the [hoagsmedia](https://www.npmjs.com/org/hoagsmedia) npm org.
|
|
96
|
+
|
|
97
|
+
1. Bump `version` in `mcp-server/package.json` and add a `CHANGELOG.md` entry.
|
|
98
|
+
2. Run `npm run sync-frugr-alias` in `mcp-server/` (also runs on `prepublishOnly`; CI fails if committed alias copies drift).
|
|
99
|
+
3. Merge to `main`, then **publish before** the pinned Settings copy reaches prod:
|
|
79
100
|
- **GitHub Actions:** run workflow **Publish MCP server** (`workflow_dispatch`), or
|
|
80
|
-
- **Tag:** push `frgur-mcp-server-vX.Y.Z` (
|
|
81
|
-
|
|
101
|
+
- **Tag:** push `frgur-mcp-server-vX.Y.Z` (publishes both packages).
|
|
102
|
+
4. Requires `NPM_TOKEN` in repo secrets — use an npm **Granular Access Token** with type **Automation** (publish to `@hoagsmedia`). Legacy/read-write tokens with account 2FA fail CI with `EOTP`; automation tokens skip OTP.
|
|
103
|
+
|
|
104
|
+
Local dry run:
|
|
82
105
|
|
|
83
|
-
|
|
106
|
+
```sh
|
|
107
|
+
cd mcp-server && npm publish --dry-run
|
|
108
|
+
cd mcp-server/frugr-alias && npm publish --dry-run
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Smoke after publish (stderr banner; needs a valid PAT — or use Settings → Test connection):
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
FRGUR_API_TOKEN=frgur_pat_… npx -y @hoagsmedia/frugr-mcp@X.Y.Z 2>&1 | head -1
|
|
115
|
+
# → [frgur-mcp] connected to …
|
|
116
|
+
```
|
package/index.mjs
CHANGED
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
13
13
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
14
14
|
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { dirname, join } from 'node:path';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
|
|
19
|
+
const PKG = JSON.parse(
|
|
20
|
+
readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'package.json'), 'utf8')
|
|
21
|
+
);
|
|
15
22
|
|
|
16
23
|
const API_URL = (process.env.FRGUR_API_URL ?? 'https://app.frgur.com').replace(/\/+$/, '');
|
|
17
24
|
const API_TOKEN = process.env.FRGUR_API_TOKEN ?? '';
|
|
@@ -51,7 +58,7 @@ async function call(method, params) {
|
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
const server = new Server(
|
|
54
|
-
{ name: 'frgur-books', version:
|
|
61
|
+
{ name: 'frgur-books', version: PKG.version },
|
|
55
62
|
{ capabilities: { tools: {} } }
|
|
56
63
|
);
|
|
57
64
|
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hoagsmedia/frgur-mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Read-only MCP bridge to your frugr books —
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Read-only MCP bridge to your frugr books — 12 tools (P&L, transactions, invoices, bills, reconciliation, time/mileage, snapshots, bookkeeping issues). Bring your own AI client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"frgur-mcp": "index.mjs"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"index.mjs",
|
|
11
|
-
"README.md"
|
|
11
|
+
"README.md",
|
|
12
|
+
"CHANGELOG.md"
|
|
12
13
|
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"sync-frugr-alias": "node scripts/sync-frugr-alias.mjs",
|
|
16
|
+
"prepublishOnly": "npm run sync-frugr-alias"
|
|
17
|
+
},
|
|
13
18
|
"engines": {
|
|
14
19
|
"node": ">=18"
|
|
15
20
|
},
|