splitwise-mcp 3.2.0 → 3.2.2

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/dist/index.js CHANGED
@@ -19,7 +19,7 @@ import { registerUtilityTools } from './tools/utilities.js';
19
19
  // client into the same registrars instead of this singleton.
20
20
  await runMcp({
21
21
  name: 'splitwise-mcp',
22
- version: '3.2.0', // x-release-please-version
22
+ version: '3.2.2', // x-release-please-version
23
23
  deps: client,
24
24
  banner: '[splitwise-mcp] This project was developed and is maintained by AI (Claude Sonnet 4.6). Use at your own discretion.',
25
25
  tools: [
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { minifiedResult, imageResult, resolveOutputDir, writeBinaryOutput, sniffMimeBytes, } from '@chrischall/mcp-utils';
2
+ import { minifiedResult, imageResult, readEnvVar, resolveOutputDir, writeBinaryOutput, sniffMimeBytes, } from '@chrischall/mcp-utils';
3
3
  /** Cap on bytes returned as base64 in the tool result. */
4
4
  const MAX_INLINE_BYTES = 4 * 1024 * 1024;
5
5
  /** Cap on extracted characters, so a long PDF can't flood the result. */
@@ -97,7 +97,7 @@ export function registerReceiptTools(server, client) {
97
97
  .optional(),
98
98
  output_dir: z
99
99
  .string()
100
- .describe('Directory to write the receipt into. Defaults to $SPLITWISE_OUTPUT_DIR, else the current working directory.')
100
+ .describe('Directory to write the receipt into. Defaults to $SPLITWISE_OUTPUT_DIR, else the current working directory. When SPLITWISE_OUTPUT_DIR is set, this must be inside it.')
101
101
  .optional(),
102
102
  write: z
103
103
  .boolean()
@@ -128,8 +128,15 @@ export function registerReceiptTools(server, client) {
128
128
  let writeError;
129
129
  if (write !== false) {
130
130
  try {
131
+ // output_dir is model-chosen: once the operator configures
132
+ // SPLITWISE_OUTPUT_DIR, a per-call directory must stay inside it
133
+ // (an escape throws, landing in writeError below). Unset keeps the
134
+ // old, unconfined behaviour.
135
+ const configuredDir = readEnvVar('SPLITWISE_OUTPUT_DIR');
131
136
  path = writeBinaryOutput({
132
- dir: resolveOutputDir(output_dir, 'SPLITWISE_OUTPUT_DIR'),
137
+ dir: resolveOutputDir(output_dir, 'SPLITWISE_OUTPUT_DIR', {
138
+ ...(configuredDir ? { allowedRoots: [configuredDir] } : {}),
139
+ }),
133
140
  baseName: `splitwise-receipt-${id}`,
134
141
  base64,
135
142
  extension: extensionFor(mimeType, url),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "splitwise-mcp",
3
- "version": "3.2.0",
3
+ "version": "3.2.2",
4
4
  "mcpName": "io.github.chrischall/splitwise-mcp",
5
5
  "description": "Splitwise MCP server for Claude — developed and maintained by AI (Claude Code)",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -45,14 +45,14 @@
45
45
  "typecheck": "tsc -p tsconfig.json --noEmit"
46
46
  },
47
47
  "dependencies": {
48
- "@chrischall/mcp-utils": "^2.6.0",
49
- "@modelcontextprotocol/server": "^2.0.0",
50
- "dotenv": "^17.4.0",
48
+ "@chrischall/mcp-utils": "^2.13.0",
49
+ "@modelcontextprotocol/server": "^2.2.0",
50
+ "dotenv": "^18.0.2",
51
51
  "unpdf": "^1.8.1",
52
52
  "zod": "^4.6.5"
53
53
  },
54
54
  "devDependencies": {
55
- "@modelcontextprotocol/client": "^2.0.0",
55
+ "@modelcontextprotocol/client": "^2.2.0",
56
56
  "@types/node": "^26.0.0",
57
57
  "@vitest/coverage-v8": "^5.0.0",
58
58
  "esbuild": "^0.28.0",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/splitwise-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.2.0",
9
+ "version": "3.2.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "splitwise-mcp",
14
- "version": "3.2.0",
14
+ "version": "3.2.2",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },