token-counter-mcp 1.0.2 → 1.0.4
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 +46 -136
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +98 -48
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,168 +1,78 @@
|
|
|
1
1
|
# Token Counter MCP
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Track every Claude token automatically — input, output, cache read/write — with a live local dashboard and per-project cost breakdown. Works in any Claude Code project with zero configuration after a one-time setup.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Quickstart
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
npx -y token-counter-mcp setup
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Restart Claude Code
|
|
14
|
-
|
|
15
|
-
### Interactive Setup (with Dashboard)
|
|
13
|
+
Restart Claude Code. That's it.
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
```
|
|
15
|
+
**What setup does:**
|
|
16
|
+
1. Registers `token-counter-mcp` globally (`--scope user`) — active in every project
|
|
17
|
+
2. Creates `~/.claude/token-counter-stop.sh` — a stop hook that logs tokens after each response
|
|
18
|
+
3. Wires the hook into `~/.claude/settings.json` — no per-project config needed
|
|
22
19
|
|
|
23
|
-
|
|
20
|
+
**Dashboard:** open the URL printed at session start (usually `http://localhost:8899`)
|
|
24
21
|
|
|
25
22
|
---
|
|
26
23
|
|
|
27
|
-
##
|
|
24
|
+
## Auto-Tracking
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|------|-------------|
|
|
31
|
-
| `count_tokens` | Exact token count for any text or conversation via Anthropic API |
|
|
32
|
-
| `log_usage` | Record actual token usage after an API call (input, output, cache) |
|
|
33
|
-
| `get_session_stats` | Running totals and USD cost for the current session |
|
|
34
|
-
| `get_usage_history` | Last N usage entries across all sessions |
|
|
35
|
-
| `reset_session` | Zero out session totals (history is preserved) |
|
|
36
|
-
| `estimate_cost` | Calculate USD cost for a given token count without making an API call |
|
|
26
|
+
After setup, token usage is logged **automatically after every Claude response** — no manual `log_usage` calls needed. The dashboard shows:
|
|
37
27
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
Once added, ask Claude things like:
|
|
28
|
+
- Session totals (input / output / cache / cost)
|
|
29
|
+
- Per-project breakdown (costs grouped by project folder)
|
|
30
|
+
- Full usage history
|
|
43
31
|
|
|
32
|
+
To check your running cost mid-session, ask Claude:
|
|
44
33
|
```
|
|
45
|
-
How many tokens is this conversation so far?
|
|
46
|
-
Log my last API call: 1500 input, 300 output, claude-opus-4-6
|
|
47
34
|
What's my total spend this session?
|
|
48
|
-
How much would 50k input + 10k output tokens cost on claude-sonnet-4-6?
|
|
49
|
-
Show me my usage history for the last 10 entries.
|
|
50
|
-
Reset my session totals.
|
|
51
35
|
```
|
|
52
36
|
|
|
53
37
|
---
|
|
54
38
|
|
|
55
|
-
##
|
|
56
|
-
|
|
57
|
-
Want to run your own instance with your own API key?
|
|
58
|
-
|
|
59
|
-
### macOS
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
# Install Railway CLI
|
|
63
|
-
brew install railway
|
|
64
|
-
|
|
65
|
-
# Clone and build
|
|
66
|
-
git clone https://github.com/krishnakantparashar/TokenCounterMCP
|
|
67
|
-
cd TokenCounterMCP
|
|
68
|
-
npm install && npm run build
|
|
69
|
-
|
|
70
|
-
# Deploy
|
|
71
|
-
railway login
|
|
72
|
-
railway init
|
|
73
|
-
railway up
|
|
74
|
-
railway domain
|
|
75
|
-
|
|
76
|
-
# Set your Anthropic API key
|
|
77
|
-
railway variables set ANTHROPIC_API_KEY=sk-ant-YOUR_KEY_HERE
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Windows (PowerShell)
|
|
81
|
-
|
|
82
|
-
```powershell
|
|
83
|
-
# Install Railway CLI (requires Node.js)
|
|
84
|
-
npm install -g @railway/cli
|
|
85
|
-
|
|
86
|
-
# Clone and build
|
|
87
|
-
git clone https://github.com/krishnakantparashar/TokenCounterMCP
|
|
88
|
-
cd TokenCounterMCP
|
|
89
|
-
npm install
|
|
90
|
-
npm run build
|
|
91
|
-
|
|
92
|
-
# Deploy
|
|
93
|
-
railway login
|
|
94
|
-
railway init
|
|
95
|
-
railway up
|
|
96
|
-
railway domain
|
|
97
|
-
|
|
98
|
-
# Set your Anthropic API key
|
|
99
|
-
railway variables set ANTHROPIC_API_KEY=sk-ant-YOUR_KEY_HERE
|
|
100
|
-
```
|
|
39
|
+
## Available Tools
|
|
101
40
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
41
|
+
| Tool | What it does |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `count_tokens` | Estimate token count for any text before reading it |
|
|
44
|
+
| `log_usage` | Manually record token usage (input, output, cache) |
|
|
45
|
+
| `get_session_stats` | Running totals and USD cost for the current session |
|
|
46
|
+
| `get_usage_history` | Last N usage entries across all sessions |
|
|
47
|
+
| `reset_session` | Zero out session totals (history is preserved) |
|
|
48
|
+
| `estimate_cost` | Calculate USD cost for a given token count |
|
|
106
49
|
|
|
107
50
|
---
|
|
108
51
|
|
|
109
|
-
##
|
|
110
|
-
|
|
111
|
-
Runs entirely on your machine. Requires Node.js 18+.
|
|
52
|
+
## Manual Install (alternative to setup)
|
|
112
53
|
|
|
113
|
-
|
|
54
|
+
If you prefer to register the MCP without the stop hook:
|
|
114
55
|
|
|
115
56
|
```bash
|
|
116
|
-
claude mcp add token-counter -- npx -y token-counter-mcp
|
|
57
|
+
claude mcp add --scope user token-counter -- npx -y token-counter-mcp
|
|
117
58
|
```
|
|
118
59
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
### Manual install (if you prefer)
|
|
122
|
-
|
|
60
|
+
Or per-project only:
|
|
123
61
|
```bash
|
|
124
|
-
|
|
125
|
-
cd TokenCounterMCP
|
|
126
|
-
npm install && npm run build
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Set your API key for exact counts (optional — falls back to ~97–99% accurate local counting without it):
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
export ANTHROPIC_API_KEY=sk-ant-YOUR_KEY_HERE # macOS/Linux
|
|
133
|
-
$env:ANTHROPIC_API_KEY="sk-ant-YOUR_KEY_HERE" # Windows PowerShell
|
|
62
|
+
claude mcp add token-counter -- npx -y token-counter-mcp
|
|
134
63
|
```
|
|
135
64
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
# macOS/Linux
|
|
140
|
-
claude mcp add token-counter -- node "/absolute/path/to/TokenCounterMCP/dist/index.js"
|
|
141
|
-
|
|
142
|
-
# Windows
|
|
143
|
-
claude mcp add token-counter -- node "C:\path\to\TokenCounterMCP\dist\index.js"
|
|
144
|
-
```
|
|
65
|
+
---
|
|
145
66
|
|
|
146
|
-
|
|
67
|
+
## Local Dashboard
|
|
147
68
|
|
|
148
|
-
|
|
69
|
+
The dashboard runs on your machine while Claude Code is active. The actual port is printed at session start:
|
|
149
70
|
|
|
150
71
|
```
|
|
151
|
-
http://localhost:8899
|
|
72
|
+
Token usage dashboard → http://localhost:8899
|
|
152
73
|
```
|
|
153
74
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Counting Modes
|
|
159
|
-
|
|
160
|
-
| Mode | Accuracy | Requires |
|
|
161
|
-
|------|----------|----------|
|
|
162
|
-
| Exact (Anthropic API) | 100% | `ANTHROPIC_API_KEY` set on server |
|
|
163
|
-
| Local approximation | ~97–99% | Nothing — works offline |
|
|
164
|
-
|
|
165
|
-
The hosted service uses exact counting. Local mode without a key uses `gpt-tokenizer` (cl100k_base BPE) as a fallback.
|
|
75
|
+
If port 8899 is taken, it increments automatically (8900, 8901, …). The current port is always saved to `~/.claude/token-counter/dashboard-port.txt` so the stop hook finds it regardless.
|
|
166
76
|
|
|
167
77
|
---
|
|
168
78
|
|
|
@@ -174,23 +84,23 @@ The hosted service uses exact counting. Local mode without a key uses `gpt-token
|
|
|
174
84
|
| `claude-sonnet-4-6` | $3.00 / 1M | $15.00 / 1M | $0.30 / 1M | $0.75 / 1M |
|
|
175
85
|
| `claude-haiku-4-5` | $1.00 / 1M | $5.00 / 1M | $0.10 / 1M | $0.25 / 1M |
|
|
176
86
|
|
|
177
|
-
Models not in the table fall back to Sonnet pricing. Versioned
|
|
87
|
+
Models not in the table fall back to Sonnet pricing. Versioned IDs (e.g. `claude-sonnet-4-6-20260101`) are matched by prefix.
|
|
178
88
|
|
|
179
89
|
---
|
|
180
90
|
|
|
181
|
-
##
|
|
91
|
+
## Token Storage
|
|
182
92
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## Token Storage (local mode only)
|
|
188
|
-
|
|
189
|
-
Usage history is stored at `~/.claude/token-counter/` (macOS/Linux) or `%USERPROFILE%\.claude\token-counter\` (Windows):
|
|
93
|
+
Usage is stored locally at `~/.claude/token-counter/`:
|
|
190
94
|
|
|
191
95
|
| File | Contents |
|
|
192
96
|
|------|----------|
|
|
193
|
-
| `session.json` | Current session totals
|
|
97
|
+
| `session.json` | Current session totals |
|
|
194
98
|
| `history.json` | All-time log, capped at 10,000 entries |
|
|
99
|
+
| `dashboard-port.txt` | Port the dashboard is currently listening on |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Requirements
|
|
195
104
|
|
|
196
|
-
|
|
105
|
+
- Node.js 18+
|
|
106
|
+
- Claude Code CLI (`claude`)
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AA6FA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B9C"}
|
package/dist/setup.js
CHANGED
|
@@ -1,61 +1,111 @@
|
|
|
1
|
-
import readline from "readline/promises";
|
|
2
1
|
import fs from "fs";
|
|
3
2
|
import path from "path";
|
|
4
3
|
import os from "os";
|
|
5
|
-
import
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
const HOME = os.homedir();
|
|
6
|
+
const CLAUDE_DIR = path.join(HOME, ".claude");
|
|
7
|
+
const GLOBAL_SETTINGS = path.join(CLAUDE_DIR, "settings.json");
|
|
8
|
+
const STOP_SH = path.join(CLAUDE_DIR, "token-counter-stop.sh");
|
|
9
|
+
function ensureDir(p) {
|
|
10
|
+
if (!fs.existsSync(p))
|
|
11
|
+
fs.mkdirSync(p, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
function readJson(p) {
|
|
13
14
|
try {
|
|
14
|
-
|
|
15
|
+
return JSON.parse(fs.readFileSync(p, "utf8"));
|
|
15
16
|
}
|
|
16
17
|
catch {
|
|
17
|
-
|
|
18
|
+
return {};
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
20
|
+
}
|
|
21
|
+
function writeJson(p, data) {
|
|
22
|
+
fs.writeFileSync(p, JSON.stringify(data, null, 2) + "\n", "utf8");
|
|
23
|
+
}
|
|
24
|
+
function registerMcp() {
|
|
25
|
+
try {
|
|
26
|
+
execSync("claude mcp remove token-counter --scope user 2>/dev/null; claude mcp add --scope user token-counter -- npx -y token-counter-mcp", { stdio: "ignore", shell: "/bin/bash" });
|
|
27
|
+
return "ok";
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
let token = "";
|
|
33
|
-
let dashboardUrl = "http://localhost:8899";
|
|
34
|
-
if (remoteUrl) {
|
|
35
|
-
// Reuse existing token so old localStorage history still works
|
|
36
|
-
token = existingEnv.DASHBOARD_TOKEN || crypto.randomBytes(12).toString("hex");
|
|
37
|
-
dashboardUrl = `${remoteUrl.replace(/\/$/, "")}/?token=${token}`;
|
|
38
|
-
console.log(`\nYour token: ${token}`);
|
|
39
|
-
console.log("Keep this — it's your personal dashboard key.\n");
|
|
29
|
+
catch {
|
|
30
|
+
return "fallback";
|
|
40
31
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
}
|
|
33
|
+
function writeStopHook() {
|
|
34
|
+
// Build the bash script without using TS template literals for the bash variables
|
|
35
|
+
// to avoid conflicts between bash $VAR syntax and TS template literal ${VAR}.
|
|
36
|
+
const D = "$"; // shorthand to embed $ chars safely
|
|
37
|
+
const lines = [
|
|
38
|
+
"#!/usr/bin/env bash",
|
|
39
|
+
`INPUT=${D}(cat)`,
|
|
40
|
+
`TRANSCRIPT=${D}(echo "${D}INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('transcript_path',''))" 2>/dev/null || echo "")`,
|
|
41
|
+
`if [[ -n "${D}TRANSCRIPT" && -f "${D}TRANSCRIPT" ]]; then`,
|
|
42
|
+
` CHARS=${D}(python3 - "${D}TRANSCRIPT" 2>/dev/null << 'PYEOF'`,
|
|
43
|
+
"import json, sys",
|
|
44
|
+
"lines = open(sys.argv[1]).readlines()",
|
|
45
|
+
"for line in reversed(lines):",
|
|
46
|
+
" try:",
|
|
47
|
+
" msg = json.loads(line)",
|
|
48
|
+
` if msg.get("type") == "assistant":`,
|
|
49
|
+
` print(len(str(msg.get("message", {}).get("content", ""))))`,
|
|
50
|
+
" break",
|
|
51
|
+
" except Exception:",
|
|
52
|
+
" pass",
|
|
53
|
+
"PYEOF",
|
|
54
|
+
")",
|
|
55
|
+
` OUT=${D}(( ${D}{CHARS:-0} / 4 ))`,
|
|
56
|
+
` IN=${D}(( OUT * 4 ))`,
|
|
57
|
+
` PROJ_DIR=${D}(basename "${D}(dirname "${D}TRANSCRIPT")")`,
|
|
58
|
+
` PROJECT_PATH=${D}(echo "${D}PROJ_DIR" | sed 's|^-|/|' | sed 's|-|/|g')`,
|
|
59
|
+
` PORT_FILE="${D}HOME/.claude/token-counter/dashboard-port.txt"`,
|
|
60
|
+
` DASH_PORT=8899`,
|
|
61
|
+
` if [[ -f "${D}PORT_FILE" ]]; then DASH_PORT=${D}(cat "${D}PORT_FILE"); fi`,
|
|
62
|
+
` curl -sf -X POST "http://localhost:${D}DASH_PORT/log" \\`,
|
|
63
|
+
` -H "Content-Type: application/json" \\`,
|
|
64
|
+
` -d "{\\"input_tokens\\":${D}IN,\\"output_tokens\\":${D}OUT,\\"model\\":\\"claude-sonnet-4-6\\",\\"description\\":\\"auto\\",\\"project\\":\\"${D}PROJECT_PATH\\"}" \\`,
|
|
65
|
+
" >/dev/null 2>&1 || true",
|
|
66
|
+
"fi",
|
|
67
|
+
"exit 0",
|
|
68
|
+
"",
|
|
69
|
+
];
|
|
70
|
+
fs.writeFileSync(STOP_SH, lines.join("\n"), { encoding: "utf8", mode: 0o755 });
|
|
71
|
+
}
|
|
72
|
+
function addStopHook() {
|
|
73
|
+
ensureDir(CLAUDE_DIR);
|
|
74
|
+
const settings = readJson(GLOBAL_SETTINGS);
|
|
75
|
+
const hooks = (settings.hooks ?? {});
|
|
76
|
+
const stopHookCmd = `/bin/bash "${STOP_SH}"`;
|
|
77
|
+
const existing = (hooks.Stop ?? []);
|
|
78
|
+
const alreadyIn = existing.some(h => h.hooks?.some(hh => hh.command === stopHookCmd));
|
|
79
|
+
if (!alreadyIn) {
|
|
80
|
+
existing.push({ matcher: "", hooks: [{ type: "command", command: stopHookCmd }] });
|
|
81
|
+
}
|
|
82
|
+
hooks.Stop = existing;
|
|
83
|
+
settings.hooks = hooks;
|
|
84
|
+
writeJson(GLOBAL_SETTINGS, settings);
|
|
85
|
+
}
|
|
86
|
+
export async function runSetup() {
|
|
87
|
+
console.log("\nToken Counter MCP — Setup\n");
|
|
88
|
+
ensureDir(CLAUDE_DIR);
|
|
89
|
+
// 1. Register MCP globally
|
|
90
|
+
process.stdout.write("Registering MCP (scope: user)... ");
|
|
91
|
+
const mcpResult = registerMcp();
|
|
92
|
+
if (mcpResult === "ok") {
|
|
93
|
+
console.log("done.");
|
|
45
94
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
...(Object.keys(env).length ? { env } : {}),
|
|
50
|
-
};
|
|
51
|
-
config.mcpServers = mcpServers;
|
|
52
|
-
fs.writeFileSync(CLAUDE_CONFIG, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
53
|
-
console.log("Written to ~/.claude.json");
|
|
54
|
-
console.log("\nDone! Restart Claude Code to activate.\n");
|
|
55
|
-
console.log(`Dashboard: ${dashboardUrl}`);
|
|
56
|
-
if (remoteUrl) {
|
|
57
|
-
console.log("Bookmark this URL — it loads your history from localStorage even when offline.\n");
|
|
95
|
+
else {
|
|
96
|
+
console.log("could not run `claude` CLI — add manually:");
|
|
97
|
+
console.log(" claude mcp add --scope user token-counter -- npx -y token-counter-mcp\n");
|
|
58
98
|
}
|
|
59
|
-
|
|
99
|
+
// 2. Write global stop hook script
|
|
100
|
+
process.stdout.write("Writing stop hook script... ");
|
|
101
|
+
writeStopHook();
|
|
102
|
+
console.log(`done. (${STOP_SH})`);
|
|
103
|
+
// 3. Register Stop hook in global settings.json
|
|
104
|
+
process.stdout.write("Adding Stop hook to ~/.claude/settings.json... ");
|
|
105
|
+
addStopHook();
|
|
106
|
+
console.log("done.");
|
|
107
|
+
console.log("\nAll set! Restart Claude Code to activate.\n");
|
|
108
|
+
console.log("Dashboard: http://localhost:8899 (exact port printed at session start)");
|
|
109
|
+
console.log("Usage is logged automatically after each Claude response.\n");
|
|
60
110
|
}
|
|
61
111
|
//# sourceMappingURL=setup.js.map
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED