@tinify-ai/mcp-server 1.0.5 → 1.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.
Files changed (44) hide show
  1. package/README.md +67 -17
  2. package/dist/api/auth.d.ts +29 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +43 -0
  5. package/dist/api/auth.js.map +1 -0
  6. package/dist/api/process.d.ts +2 -3
  7. package/dist/api/process.d.ts.map +1 -1
  8. package/dist/api/process.js +16 -6
  9. package/dist/api/process.js.map +1 -1
  10. package/dist/api/upload.d.ts +1 -1
  11. package/dist/api/upload.d.ts.map +1 -1
  12. package/dist/api/upload.js +2 -5
  13. package/dist/api/upload.js.map +1 -1
  14. package/dist/index.js +71 -9
  15. package/dist/index.js.map +1 -1
  16. package/dist/session/manager.d.ts +6 -0
  17. package/dist/session/manager.d.ts.map +1 -1
  18. package/dist/session/manager.js +42 -7
  19. package/dist/session/manager.js.map +1 -1
  20. package/dist/tools/login.d.ts +2 -0
  21. package/dist/tools/login.d.ts.map +1 -0
  22. package/dist/tools/login.js +64 -0
  23. package/dist/tools/login.js.map +1 -0
  24. package/dist/tools/logout.d.ts +2 -0
  25. package/dist/tools/logout.d.ts.map +1 -0
  26. package/dist/tools/logout.js +20 -0
  27. package/dist/tools/logout.js.map +1 -0
  28. package/dist/tools/optimize.d.ts +1 -1
  29. package/dist/tools/optimize.d.ts.map +1 -1
  30. package/dist/tools/optimize.js +7 -13
  31. package/dist/tools/optimize.js.map +1 -1
  32. package/dist/tools/status.d.ts +2 -0
  33. package/dist/tools/status.d.ts.map +1 -0
  34. package/dist/tools/status.js +41 -0
  35. package/dist/tools/status.js.map +1 -0
  36. package/dist/tools/upgrade.d.ts +2 -0
  37. package/dist/tools/upgrade.d.ts.map +1 -0
  38. package/dist/tools/upgrade.js +10 -0
  39. package/dist/tools/upgrade.js.map +1 -0
  40. package/dist/utils/browser.d.ts +2 -0
  41. package/dist/utils/browser.d.ts.map +1 -0
  42. package/dist/utils/browser.js +21 -0
  43. package/dist/utils/browser.js.map +1 -0
  44. package/package.json +1 -1
package/README.md CHANGED
@@ -98,12 +98,12 @@ Optimizes an image with smart lossy compression (typically 60-80% size reduction
98
98
  | `output_width_px` | int | No | — | Target width in pixels |
99
99
  | `output_height_px` | int | No | — | Target height in pixels |
100
100
  | `output_upscale_factor` | float | No | — | AI upscale factor (e.g. 2.0, 4.0) |
101
- | `output_resize_mode` | string | No | pad | `pad` (white padding) or `crop` (smart crop). Only used when both width and height are set |
101
+ | `output_resize_behavior` | string | No | pad | `pad` (white padding) or `crop` (smart crop). Only used when both width and height are set |
102
102
  | `output_seo_tag_gen` | bool | No | true | Generate SEO metadata and rename file to SEO slug. Costs 1 extra credit |
103
103
 
104
104
  ### Resize Behavior
105
105
 
106
- | Dimensions provided | Behavior | `output_resize_mode` |
106
+ | Dimensions provided | Behavior | `output_resize_behavior` |
107
107
  |---|---|---|
108
108
  | Width only | Proportional scale | N/A |
109
109
  | Height only | Proportional scale | N/A |
@@ -139,7 +139,7 @@ Optimizes an image with smart lossy compression (typically 60-80% size reduction
139
139
  **Exact dimensions with smart crop:**
140
140
 
141
141
  ```json
142
- { "input": "/Users/me/hero.png", "output_width_px": 1080, "output_height_px": 1080, "output_resize_mode": "crop" }
142
+ { "input": "/Users/me/hero.png", "output_width_px": 1080, "output_height_px": 1080, "output_resize_behavior": "crop" }
143
143
  ```
144
144
 
145
145
  **AI upscale 4x:**
@@ -221,32 +221,72 @@ All processing happens server-side via the [Tinify API](https://tinify.ai). The
221
221
 
222
222
  ## Credits
223
223
 
224
- | | Free Tier |
225
- |---|-----------|
226
- | Credits/day | 20 |
227
- | Images/day | ~5 (with default settings) |
228
- | Cost per image | 3 credits + 1 if SEO tags enabled (default) |
229
- | Signup required | No |
224
+ | | Guest | Free | Pro | Max |
225
+ |---|---|---|---|---|
226
+ | Credits/day or month | 20/day | 50/day | 3,000/month | 10,000/month |
227
+ | Images/day (default settings) | ~5 | ~12 | ~750 | ~2,500 |
228
+ | Cost per image | 3 credits + 1 SEO | same | same | same |
229
+ | Signup required | No | Free signup | Paid | Paid |
230
230
 
231
- Session tokens are stored locally at `~/.tinify/session.json` and persist across invocations.
231
+ Session data is stored locally at `~/.tinify/session.json` and persists across invocations.
232
232
 
233
- Need more credits? See plans at [tinify.ai](https://tinify.ai/#pricing).
233
+ ## Account & Credits
234
+
235
+ Log in to unlock more credits and share them across the web app and MCP server:
236
+
237
+ ```
238
+ Use the login tool to sign in.
239
+ Use the status tool to check your current credits.
240
+ Use the upgrade tool to open the pricing page.
241
+ Use the logout tool to sign out.
242
+ ```
243
+
244
+ ### login
245
+
246
+ Opens a browser window to complete login (Google, Facebook, or email/magic link). After approval, your account is linked and credits are shared with the web app.
247
+
248
+ ```
249
+ Login complete: user@example.com (Pro tier, 2,850 of 3,000 credits remaining)
250
+ ```
251
+
252
+ ### status
253
+
254
+ Check your current account status and credits before batch processing:
255
+
256
+ ```
257
+ Logged in as user@example.com (Pro tier)
258
+ Credits: 2,850 of 3,000 remaining
259
+ Resets: 03/01/2026, 12:00 AM PST
260
+ ```
261
+
262
+ ### logout
263
+
264
+ Revokes the session and reverts to guest mode (20 credits/day).
265
+
266
+ ### upgrade
267
+
268
+ Opens [tinify.ai/pricing](https://tinify.ai/pricing) in your browser.
234
269
 
235
270
  ## Tips for AI Agents
236
271
 
237
272
  Paste this into your `CLAUDE.md` or system prompt to help agents use the tool effectively:
238
273
 
239
274
  ```
240
- ## Tinify MCP — optimize_image
275
+ ## Tinify MCP
276
+
277
+ Tools: optimize_image, login, logout, status, upgrade
241
278
 
242
- - Each call costs 3 credits + 1 if SEO enabled (default). Free tier: 20 credits/day.
279
+ - Use status to check credits before batch processing
280
+ - Each optimize_image call costs 3 credits + 1 if SEO enabled (default)
281
+ - Guest: 20 credits/day. Free account: 50/day. Pro: 3,000/month.
243
282
  - Always use absolute file paths, not relative.
244
283
  - Set only width OR height for proportional resize. Set both for exact dimensions.
245
- - When both dimensions are set, use output_resize_mode: "crop" for photos, "pad" for logos/icons.
284
+ - When both dimensions are set, use output_resize_behavior: "crop" for photos, "pad" for logos/icons.
246
285
  - output_seo_tag_gen (default true) renames the file to an SEO slug and generates alt text + keywords.
247
286
  - Set output_seo_tag_gen: false to save 1 credit when SEO metadata is not needed.
248
287
  - HEIC, TIFF, BMP inputs are auto-converted to JPG.
249
288
  - For batch processing, call optimize_image once per file.
289
+ - If credits run out, use login to sign in or upgrade to open pricing.
250
290
  ```
251
291
 
252
292
  ## Troubleshooting
@@ -257,9 +297,19 @@ Paste this into your `CLAUDE.md` or system prompt to help agents use the tool ef
257
297
  - Try running directly: `npx -y @tinify-ai/mcp-server@latest` (should start without errors)
258
298
 
259
299
  **"Insufficient credits" error:**
260
- - Free tier allows 20 credits/day (resets daily)
261
- - Each image costs 3-4 credits depending on settings
262
- - Disable SEO tags (`output_seo_tag_gen: false`) to reduce to 3 credits/image
300
+ - Use the `status` tool to check remaining credits
301
+ - Use the `login` tool to sign in for more credits (free accounts get 50/day)
302
+ - Use the `upgrade` tool to see paid plans (Pro: 3,000/month, Max: 10,000/month)
303
+ - Disable SEO tags (`output_seo_tag_gen: false`) to reduce cost to 3 credits/image
304
+
305
+ **Login browser window doesn't open:**
306
+ - Open this URL manually: `https://tinify.ai/mcp/authorize` and enter the code shown in the terminal
307
+ - Ensure a browser is installed and accessible
308
+
309
+ **Session token issues:**
310
+ - Session data is stored at `~/.tinify/session.json`
311
+ - Delete this file to reset and start fresh
312
+ - Use `logout` then `login` to re-authenticate
263
313
 
264
314
  **File not found:**
265
315
  - Use absolute paths for local files
@@ -0,0 +1,29 @@
1
+ export interface DeviceCodeResponse {
2
+ device_code: string;
3
+ user_code: string;
4
+ verify_url: string;
5
+ }
6
+ export interface TokenPollResponse {
7
+ status: "pending" | "approved" | "expired" | "denied";
8
+ mcp_token?: string;
9
+ user?: {
10
+ email: string;
11
+ tier: string;
12
+ credits_remaining: number;
13
+ credits_limit: number;
14
+ credits_reset_at: string | null;
15
+ };
16
+ }
17
+ export interface AccountStatus {
18
+ logged_in: boolean;
19
+ email?: string;
20
+ tier: string;
21
+ credits_remaining: number;
22
+ credits_limit: number;
23
+ credits_reset_at: string | null;
24
+ }
25
+ export declare function requestDeviceCode(baseUrl: string): Promise<DeviceCodeResponse>;
26
+ export declare function pollForToken(baseUrl: string, deviceCode: string): Promise<TokenPollResponse>;
27
+ export declare function revokeToken(baseUrl: string, mcpToken: string): Promise<void>;
28
+ export declare function getAccountStatus(baseUrl: string, mcpToken: string | null, sessionToken: string | null): Promise<AccountStatus>;
29
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAOpF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAOlG;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC,aAAa,CAAC,CAaxB"}
@@ -0,0 +1,43 @@
1
+ import { ApiError } from "./client.js";
2
+ export async function requestDeviceCode(baseUrl) {
3
+ const response = await fetch(`${baseUrl}/mcp/auth/device-code`, { method: "POST" });
4
+ if (!response.ok) {
5
+ const body = await response.json().catch(() => ({}));
6
+ throw new ApiError(body.detail || "Failed to create device code", response.status);
7
+ }
8
+ return response.json();
9
+ }
10
+ export async function pollForToken(baseUrl, deviceCode) {
11
+ const response = await fetch(`${baseUrl}/mcp/auth/token?device_code=${deviceCode}`);
12
+ if (!response.ok) {
13
+ const body = await response.json().catch(() => ({}));
14
+ throw new ApiError(body.detail || "Token poll failed", response.status);
15
+ }
16
+ return response.json();
17
+ }
18
+ export async function revokeToken(baseUrl, mcpToken) {
19
+ const response = await fetch(`${baseUrl}/mcp/auth/revoke`, {
20
+ method: "POST",
21
+ headers: { Authorization: `Bearer ${mcpToken}` },
22
+ });
23
+ if (!response.ok) {
24
+ const body = await response.json().catch(() => ({}));
25
+ throw new ApiError(body.detail || "Token revocation failed", response.status);
26
+ }
27
+ }
28
+ export async function getAccountStatus(baseUrl, mcpToken, sessionToken) {
29
+ const headers = {};
30
+ if (mcpToken) {
31
+ headers.Authorization = `Bearer ${mcpToken}`;
32
+ }
33
+ else if (sessionToken) {
34
+ headers["X-Session-Token"] = sessionToken;
35
+ }
36
+ const response = await fetch(`${baseUrl}/mcp/auth/status`, { headers });
37
+ if (!response.ok) {
38
+ const body = await response.json().catch(() => ({}));
39
+ throw new ApiError(body.detail || "Status check failed", response.status);
40
+ }
41
+ return response.json();
42
+ }
43
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6BvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,UAAkB;IACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,+BAA+B,UAAU,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,QAAgB;IACjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,kBAAkB,EAAE;QACzD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE;KACjD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,QAAuB,EACvB,YAA2B;IAE3B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;IAC/C,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -3,8 +3,7 @@ export interface ProcessingSettings {
3
3
  output_upscale_factor?: number;
4
4
  output_width?: number;
5
5
  output_height?: number;
6
- output_aspect_lock?: boolean;
7
- output_resize_mode?: "pad" | "crop";
6
+ output_resize_behavior?: "pad" | "crop";
8
7
  output_seo_tag_gen?: boolean;
9
8
  output_seo_rename?: boolean;
10
9
  }
@@ -12,7 +11,7 @@ interface ProcessParams {
12
11
  baseUrl: string;
13
12
  tempFileIds: string[];
14
13
  settings: ProcessingSettings;
15
- sessionToken: string | null;
14
+ authHeaders: Record<string, string>;
16
15
  }
17
16
  interface JobInfo {
18
17
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/api/process.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAiCrF"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/api/process.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDrF"}
@@ -1,12 +1,10 @@
1
1
  import { ApiError } from "./client.js";
2
2
  export async function triggerProcessing(params) {
3
- const { baseUrl, tempFileIds, settings, sessionToken } = params;
3
+ const { baseUrl, tempFileIds, settings, authHeaders } = params;
4
4
  const headers = {
5
5
  "Content-Type": "application/json",
6
+ ...authHeaders,
6
7
  };
7
- if (sessionToken) {
8
- headers["X-Session-Token"] = sessionToken;
9
- }
10
8
  const response = await fetch(`${baseUrl}/auto`, {
11
9
  method: "POST",
12
10
  headers,
@@ -18,8 +16,20 @@ export async function triggerProcessing(params) {
18
16
  if (!response.ok) {
19
17
  const body = await response.json().catch(() => ({}));
20
18
  if (response.status === 429) {
21
- const remaining = response.headers.get("X-RateLimit-Remaining") ?? "0";
22
- throw new ApiError(`Insufficient credits. ${remaining} of 20 daily credits left. ${body.detail ?? ""}`.trim(), 429, body.detail);
19
+ if (body.is_guest) {
20
+ throw new ApiError(`You've used all ${body.credits_limit || 20} free daily credits. ` +
21
+ `Log in for more credits (free = 50/day, Pro = 3,000/month). ` +
22
+ `Use the login tool to sign in, or wait until credits reset.`, 429, body.detail);
23
+ }
24
+ else if (body.tier) {
25
+ throw new ApiError(`You've used all ${body.credits_limit} credits for this period (${body.tier} tier). ` +
26
+ `Upgrade for more credits, or wait until they reset.`, 429, body.detail);
27
+ }
28
+ else {
29
+ // Fallback for old backend format
30
+ const remaining = response.headers.get("X-RateLimit-Remaining") ?? "0";
31
+ throw new ApiError(`Insufficient credits. ${remaining} credits remaining.`, 429, body.detail);
32
+ }
23
33
  }
24
34
  throw new ApiError(body.detail || "Processing failed", response.status, body.detail);
25
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/api/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiCvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAqB;IAC3D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAEhE,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,OAAO,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,aAAa,EAAE,WAAW;YAC1B,QAAQ;SACT,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC;YACvE,MAAM,IAAI,QAAQ,CAChB,yBAAyB,SAAS,8BAA8B,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAC1F,GAAG,EACH,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,mBAAmB,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/api/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgCvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAqB;IAC3D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE/D,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,OAAO,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,aAAa,EAAE,WAAW;YAC1B,QAAQ;SACT,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,IAAI,CAAC,aAAa,IAAI,EAAE,uBAAuB;oBAClE,8DAA8D;oBAC9D,6DAA6D,EAC7D,GAAG,EACH,IAAI,CAAC,MAAM,CACZ,CAAC;YACJ,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,IAAI,CAAC,aAAa,6BAA6B,IAAI,CAAC,IAAI,UAAU;oBACrF,qDAAqD,EACrD,GAAG,EACH,IAAI,CAAC,MAAM,CACZ,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,kCAAkC;gBAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC;gBACvE,MAAM,IAAI,QAAQ,CAChB,yBAAyB,SAAS,qBAAqB,EACvD,GAAG,EACH,IAAI,CAAC,MAAM,CACZ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,mBAAmB,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -2,7 +2,7 @@ interface UploadParams {
2
2
  baseUrl: string;
3
3
  fileBuffer: Buffer;
4
4
  filename: string;
5
- sessionToken: string | null;
5
+ authHeaders: Record<string, string>;
6
6
  }
7
7
  interface UploadResult {
8
8
  temp_file_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/api/upload.ts"],"names":[],"mappings":"AAEA,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAyC5E"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/api/upload.ts"],"names":[],"mappings":"AAEA,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAsC5E"}
@@ -1,12 +1,9 @@
1
1
  import { ApiError } from "./client.js";
2
2
  export async function uploadFile(params) {
3
- const { baseUrl, fileBuffer, filename, sessionToken } = params;
3
+ const { baseUrl, fileBuffer, filename, authHeaders } = params;
4
4
  const formData = new FormData();
5
5
  formData.append("file", new Blob([fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength)]), filename);
6
- const headers = {};
7
- if (sessionToken) {
8
- headers["X-Session-Token"] = sessionToken;
9
- }
6
+ const headers = { ...authHeaders };
10
7
  const response = await fetch(`${baseUrl}/upload`, {
11
8
  method: "POST",
12
9
  headers,
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/api/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiBvC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACnD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAE/D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CACb,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAgB,CAAC,CAAC,EACxH,QAAQ,CACT,CAAC;IAEF,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAAC,kCAAkC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,QAAQ,CAChB,6DAA6D,EAC7D,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,MAAM,IAAI,eAAe,EAC9B,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/api/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiBvC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACnD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE9D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CACb,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAgB,CAAC,CAAC,EACxH,QAAQ,CACT,CAAC;IAEF,MAAM,OAAO,GAA2B,EAAE,GAAG,WAAW,EAAE,CAAC;IAE3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAAC,kCAAkC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,QAAQ,CAChB,6DAA6D,EAC7D,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,MAAM,IAAI,eAAe,EAC9B,QAAQ,CAAC,MAAM,EACf,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
package/dist/index.js CHANGED
@@ -3,16 +3,21 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import * as z from "zod";
5
5
  import { optimizeImage } from "./tools/optimize.js";
6
+ import { loginTool } from "./tools/login.js";
7
+ import { logoutTool } from "./tools/logout.js";
8
+ import { statusTool } from "./tools/status.js";
9
+ import { upgradeTool } from "./tools/upgrade.js";
6
10
  import { formatErrorForMcp } from "./errors.js";
7
11
  const server = new McpServer({
8
12
  name: "tinify",
9
- version: "1.0.0",
13
+ version: "1.2.0",
10
14
  });
11
15
  server.registerTool("optimize_image", {
12
16
  title: "Optimize Image",
13
17
  description: "Optimize an image: smart lossy compression (typically 60-80% size reduction), optional resize/upscale/format conversion, and AI-generated SEO metadata. " +
14
18
  "Accepts absolute local file paths or remote URLs. Supported formats: JPG, PNG, WebP, AVIF, HEIC, TIFF, BMP (max 50 MB). " +
15
- "Each call costs 3 credits + 1 if SEO tags enabled. Free tier: 20 credits/day, no signup.",
19
+ "Each call costs 3 credits + 1 if SEO tags enabled. Free tier: 20 credits/day, no signup. " +
20
+ "Log in with the login tool for more credits. Use status tool to check remaining credits before batch processing.",
16
21
  inputSchema: {
17
22
  input: z
18
23
  .string()
@@ -31,25 +36,24 @@ server.registerTool("optimize_image", {
31
36
  .int()
32
37
  .positive()
33
38
  .optional()
34
- .describe("Target width in pixels. Set only width for proportional resize. Set both width and height for exact output dimensions (see output_resize_mode)."),
39
+ .describe("Target width in pixels. Set only width for proportional resize. Set both width and height for exact output dimensions (see output_resize_behavior)."),
35
40
  output_height_px: z
36
41
  .number()
37
42
  .int()
38
43
  .positive()
39
44
  .optional()
40
- .describe("Target height in pixels. Set only height for proportional resize. Set both width and height for exact output dimensions (see output_resize_mode)."),
45
+ .describe("Target height in pixels. Set only height for proportional resize. Set both width and height for exact output dimensions (see output_resize_behavior)."),
41
46
  output_upscale_factor: z
42
47
  .number()
43
48
  .min(0.1)
44
49
  .max(10)
45
50
  .optional()
46
51
  .describe("Upscale factor (e.g., 2.0 for 2x, 4.0 for 4x). Triggers AI upscaling."),
47
- output_resize_mode: z
52
+ output_resize_behavior: z
48
53
  .enum(["pad", "crop"])
49
54
  .optional()
50
- .describe("How to handle aspect ratio mismatch when both width and height are specified. " +
51
- "'pad' adds white padding (default), 'crop' uses smart cropping. " +
52
- "Only applies when both output_width_px and output_height_px are set."),
55
+ .describe("When both width and height are set and aspect ratio differs: " +
56
+ "'pad' adds white padding (default), 'crop' smart-crops to fill exact dimensions"),
53
57
  output_seo_tag_gen: z
54
58
  .boolean()
55
59
  .optional()
@@ -75,7 +79,7 @@ server.registerTool("optimize_image", {
75
79
  output_width_px: params.output_width_px,
76
80
  output_height_px: params.output_height_px,
77
81
  output_upscale_factor: params.output_upscale_factor,
78
- output_resize_mode: params.output_resize_mode,
82
+ output_resize_behavior: params.output_resize_behavior,
79
83
  output_seo_tag_gen: params.output_seo_tag_gen,
80
84
  });
81
85
  const summary = [
@@ -101,6 +105,64 @@ server.registerTool("optimize_image", {
101
105
  return formatErrorForMcp(error);
102
106
  }
103
107
  });
108
+ server.registerTool("login", {
109
+ title: "Log In",
110
+ description: "Log in to your Tinify account via browser to unlock more credits. " +
111
+ "Opens a browser window where you complete login (Google, Facebook, or email). " +
112
+ "After login, MCP automatically picks up your account with shared credits across web and MCP. " +
113
+ "Free: 50 credits/day. Pro: 3,000/month. Max: 10,000/month.",
114
+ inputSchema: {},
115
+ }, async () => {
116
+ try {
117
+ const message = await loginTool();
118
+ return { content: [{ type: "text", text: message }] };
119
+ }
120
+ catch (error) {
121
+ return formatErrorForMcp(error);
122
+ }
123
+ });
124
+ server.registerTool("logout", {
125
+ title: "Log Out",
126
+ description: "Log out of your Tinify account. Reverts to guest session (20 free credits/day). " +
127
+ "Your web app account is not affected.",
128
+ inputSchema: {},
129
+ }, async () => {
130
+ try {
131
+ const message = await logoutTool();
132
+ return { content: [{ type: "text", text: message }] };
133
+ }
134
+ catch (error) {
135
+ return formatErrorForMcp(error);
136
+ }
137
+ });
138
+ server.registerTool("status", {
139
+ title: "Account Status",
140
+ description: "Check your Tinify account status: login state, tier, credits remaining, and credit reset time. " +
141
+ "Use this before batch processing to verify sufficient credits.",
142
+ inputSchema: {},
143
+ }, async () => {
144
+ try {
145
+ const message = await statusTool();
146
+ return { content: [{ type: "text", text: message }] };
147
+ }
148
+ catch (error) {
149
+ return formatErrorForMcp(error);
150
+ }
151
+ });
152
+ server.registerTool("upgrade", {
153
+ title: "Upgrade Plan",
154
+ description: "Open the Tinify pricing page in your browser to upgrade your plan for more credits. " +
155
+ "Plans: Free (50/day), Pro (3,000/month), Max (10,000/month).",
156
+ inputSchema: {},
157
+ }, async () => {
158
+ try {
159
+ const message = await upgradeTool();
160
+ return { content: [{ type: "text", text: message }] };
161
+ }
162
+ catch (error) {
163
+ return formatErrorForMcp(error);
164
+ }
165
+ });
104
166
  const transport = new StdioServerTransport();
105
167
  await server.connect(transport);
106
168
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,13 @@ export declare class SessionManager {
2
2
  readonly sessionDir: string;
3
3
  private readonly sessionFile;
4
4
  constructor(sessionDir?: string);
5
+ private readData;
6
+ private writeData;
5
7
  getToken(): string | null;
6
8
  saveToken(token: string): void;
9
+ getMcpToken(): string | null;
10
+ saveMcpToken(token: string, email: string, tier: string): void;
11
+ clearMcpToken(): void;
12
+ getAuthHeaders(): Record<string, string>;
7
13
  }
8
14
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAQA,qBAAa,cAAc;IACzB,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAK/B,QAAQ,IAAI,MAAM,GAAG,IAAI;IAUzB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAK/B"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAWA,qBAAa,cAAc;IACzB,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAK/B,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,SAAS;IAKjB,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW9D,aAAa,IAAI,IAAI;IAQrB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAUzC"}
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
- import * as path from "node:path";
3
2
  import * as os from "node:os";
3
+ import * as path from "node:path";
4
4
  export class SessionManager {
5
5
  sessionDir;
6
6
  sessionFile;
@@ -8,20 +8,55 @@ export class SessionManager {
8
8
  this.sessionDir = sessionDir ?? path.join(os.homedir(), ".tinify");
9
9
  this.sessionFile = path.join(this.sessionDir, "session.json");
10
10
  }
11
- getToken() {
11
+ readData() {
12
12
  try {
13
13
  const raw = fs.readFileSync(this.sessionFile, "utf-8");
14
- const data = JSON.parse(raw);
15
- return data.session_token ?? null;
14
+ return JSON.parse(raw);
16
15
  }
17
16
  catch {
18
17
  return null;
19
18
  }
20
19
  }
21
- saveToken(token) {
20
+ writeData(data) {
22
21
  fs.mkdirSync(this.sessionDir, { recursive: true });
23
- const data = { session_token: token };
24
- fs.writeFileSync(this.sessionFile, JSON.stringify(data, null, 2));
22
+ fs.writeFileSync(this.sessionFile, JSON.stringify(data, null, 2), { mode: 0o600 });
23
+ }
24
+ getToken() {
25
+ return this.readData()?.session_token ?? null;
26
+ }
27
+ saveToken(token) {
28
+ const existing = this.readData();
29
+ this.writeData({ ...existing, session_token: token });
30
+ }
31
+ getMcpToken() {
32
+ return this.readData()?.mcp_token ?? null;
33
+ }
34
+ saveMcpToken(token, email, tier) {
35
+ const existing = this.readData();
36
+ this.writeData({
37
+ ...existing,
38
+ session_token: existing?.session_token ?? "",
39
+ mcp_token: token,
40
+ user_email: email,
41
+ user_tier: tier,
42
+ });
43
+ }
44
+ clearMcpToken() {
45
+ const existing = this.readData();
46
+ if (existing) {
47
+ const { mcp_token, user_email, user_tier, ...rest } = existing;
48
+ this.writeData(rest);
49
+ }
50
+ }
51
+ getAuthHeaders() {
52
+ const data = this.readData();
53
+ if (data?.mcp_token) {
54
+ return { Authorization: `Bearer ${data.mcp_token}` };
55
+ }
56
+ if (data?.session_token) {
57
+ return { "X-Session-Token": data.session_token };
58
+ }
59
+ return {};
25
60
  }
26
61
  }
27
62
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAM9B,MAAM,OAAO,cAAc;IACT,UAAU,CAAS;IAClB,WAAW,CAAS;IAErC,YAAY,UAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACnD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,MAAM,OAAO,cAAc;IACT,UAAU,CAAS;IAClB,WAAW,CAAS;IAErC,YAAY,UAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,IAAiB;QACjC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,IAAI,IAAI,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAiB,CAAC,CAAC;IACvE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,IAAI,IAAI,CAAC;IAC5C,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,IAAY;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,QAAQ;YACX,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,EAAE;YAC5C,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAmB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;YACxB,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function loginTool(): Promise<string>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"AAQA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAkDjD"}
@@ -0,0 +1,64 @@
1
+ import { SessionManager } from "../session/manager.js";
2
+ import { DEFAULT_BASE_URL } from "../api/client.js";
3
+ import { requestDeviceCode, pollForToken, getAccountStatus } from "../api/auth.js";
4
+ import { openBrowser } from "../utils/browser.js";
5
+ const POLL_INTERVAL_MS = 3_000;
6
+ const POLL_TIMEOUT_MS = 5 * 60 * 1000;
7
+ export async function loginTool() {
8
+ const sessionManager = new SessionManager();
9
+ const baseUrl = process.env.TINIFY_API_URL ?? DEFAULT_BASE_URL;
10
+ // If already logged in, return current status
11
+ const existingToken = sessionManager.getMcpToken();
12
+ if (existingToken) {
13
+ const status = await getAccountStatus(baseUrl, existingToken, null);
14
+ if (status.logged_in) {
15
+ return `Already logged in as ${status.email} (${status.tier} tier, ${status.credits_remaining.toLocaleString()} credits remaining).`;
16
+ }
17
+ // Token expired, clear it
18
+ sessionManager.clearMcpToken();
19
+ }
20
+ // Request device code
21
+ const { device_code, user_code, verify_url } = await requestDeviceCode(baseUrl);
22
+ const authorizeUrl = `${verify_url}?code=${user_code}`;
23
+ // Open browser
24
+ const opened = openBrowser(authorizeUrl);
25
+ const browserMsg = opened
26
+ ? `Opening browser... Complete login at tinify.ai.`
27
+ : `Open this URL to log in: ${authorizeUrl}`;
28
+ // Poll for approval
29
+ const startTime = Date.now();
30
+ while (Date.now() - startTime < POLL_TIMEOUT_MS) {
31
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
32
+ const result = await pollForToken(baseUrl, device_code);
33
+ if (result.status === "approved" && result.mcp_token && result.user) {
34
+ sessionManager.saveMcpToken(result.mcp_token, result.user.email, result.user.tier);
35
+ const resetInfo = result.user.credits_reset_at
36
+ ? ` until ${formatResetTime(result.user.credits_reset_at)}`
37
+ : "";
38
+ return `Logged in as ${result.user.email} (${capitalize(result.user.tier)} tier, ${result.user.credits_remaining.toLocaleString()} of ${result.user.credits_limit.toLocaleString()} credits remaining${resetInfo})`;
39
+ }
40
+ if (result.status === "denied") {
41
+ return "Authorization denied.";
42
+ }
43
+ if (result.status === "expired") {
44
+ return "Login timed out. Try again.";
45
+ }
46
+ }
47
+ return "Login timed out after 5 minutes. Try again.";
48
+ }
49
+ function capitalize(s) {
50
+ return s.charAt(0).toUpperCase() + s.slice(1);
51
+ }
52
+ function formatResetTime(isoString) {
53
+ const date = new Date(isoString);
54
+ return date.toLocaleString("en-US", {
55
+ hour: "numeric",
56
+ minute: "2-digit",
57
+ hour12: true,
58
+ timeZoneName: "short",
59
+ month: "2-digit",
60
+ day: "2-digit",
61
+ year: "numeric",
62
+ });
63
+ }
64
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logoutTool(): Promise<string>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/tools/logout.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBlD"}
@@ -0,0 +1,20 @@
1
+ import { SessionManager } from "../session/manager.js";
2
+ import { DEFAULT_BASE_URL } from "../api/client.js";
3
+ import { revokeToken } from "../api/auth.js";
4
+ export async function logoutTool() {
5
+ const sessionManager = new SessionManager();
6
+ const baseUrl = process.env.TINIFY_API_URL ?? DEFAULT_BASE_URL;
7
+ const mcpToken = sessionManager.getMcpToken();
8
+ if (!mcpToken) {
9
+ return "Not logged in. Already using guest session (20 free credits/day).";
10
+ }
11
+ try {
12
+ await revokeToken(baseUrl, mcpToken);
13
+ }
14
+ catch {
15
+ // Best-effort revocation — clear locally regardless
16
+ }
17
+ sessionManager.clearMcpToken();
18
+ return "Logged out. Using guest session (20 free credits/day).";
19
+ }
20
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/tools/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC;IAE/D,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,mEAAmE,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,cAAc,CAAC,aAAa,EAAE,CAAC;IAC/B,OAAO,wDAAwD,CAAC;AAClE,CAAC"}
@@ -5,7 +5,7 @@ export interface OptimizeImageParams {
5
5
  output_width_px?: number;
6
6
  output_height_px?: number;
7
7
  output_upscale_factor?: number;
8
- output_resize_mode?: "pad" | "crop";
8
+ output_resize_behavior?: "pad" | "crop";
9
9
  output_seo_tag_gen?: boolean;
10
10
  baseUrl?: string;
11
11
  timeoutMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAoG9B"}
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA8F9B"}
@@ -14,18 +14,17 @@ export async function optimizeImage(params) {
14
14
  // 1. Resolve input (read file or fetch URL)
15
15
  const input = await resolveInput(params.input);
16
16
  // 2. Upload to backend
17
- const sessionToken = sessionManager.getToken();
17
+ const authHeaders = sessionManager.getAuthHeaders();
18
18
  const uploadResult = await uploadFile({
19
19
  baseUrl,
20
20
  fileBuffer: input.buffer,
21
21
  filename: input.filename,
22
- sessionToken,
22
+ authHeaders,
23
23
  });
24
- // Persist new session token if returned
24
+ // Persist new session token if returned (for guest sessions)
25
25
  if (uploadResult.session_token) {
26
26
  sessionManager.saveToken(uploadResult.session_token);
27
27
  }
28
- const currentToken = uploadResult.session_token ?? sessionToken;
29
28
  // 3. Build settings (smart defaults: compress always, SEO tags on)
30
29
  const settings = {
31
30
  output_format: params.output_format ?? "original",
@@ -41,21 +40,16 @@ export async function optimizeImage(params) {
41
40
  if (params.output_upscale_factor !== undefined) {
42
41
  settings.output_upscale_factor = params.output_upscale_factor;
43
42
  }
44
- // Derive aspect_lock: false only when both dimensions are specified (exact output requested)
45
- // Otherwise omit (backend defaults to true = proportional scaling)
46
- if (params.output_width_px !== undefined && params.output_height_px !== undefined) {
47
- settings.output_aspect_lock = false;
48
- settings.output_resize_mode = params.output_resize_mode ?? "pad";
49
- }
50
- else if (params.output_resize_mode !== undefined) {
51
- settings.output_resize_mode = params.output_resize_mode;
43
+ // When dimensions are set, pass resize_behavior (pad default, crop opt-in)
44
+ if (params.output_width_px !== undefined || params.output_height_px !== undefined) {
45
+ settings.output_resize_behavior = params.output_resize_behavior ?? "pad";
52
46
  }
53
47
  // 4. Trigger processing
54
48
  const processResult = await triggerProcessing({
55
49
  baseUrl,
56
50
  tempFileIds: [uploadResult.temp_file_id],
57
51
  settings,
58
- sessionToken: currentToken,
52
+ authHeaders,
59
53
  });
60
54
  const job = processResult.jobs[0];
61
55
  if (!job?.id) {
@@ -1 +1 @@
1
- {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusTool(): Promise<string>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAyBlD"}
@@ -0,0 +1,41 @@
1
+ import { SessionManager } from "../session/manager.js";
2
+ import { DEFAULT_BASE_URL } from "../api/client.js";
3
+ import { getAccountStatus } from "../api/auth.js";
4
+ export async function statusTool() {
5
+ const sessionManager = new SessionManager();
6
+ const baseUrl = process.env.TINIFY_API_URL ?? DEFAULT_BASE_URL;
7
+ const mcpToken = sessionManager.getMcpToken();
8
+ const sessionToken = sessionManager.getToken();
9
+ const status = await getAccountStatus(baseUrl, mcpToken, sessionToken);
10
+ if (status.logged_in) {
11
+ const resetInfo = status.credits_reset_at
12
+ ? `Resets: ${formatResetTime(status.credits_reset_at)}`
13
+ : "";
14
+ return [
15
+ `Logged in as ${status.email} (${capitalize(status.tier)} tier)`,
16
+ `Credits: ${status.credits_remaining.toLocaleString()} of ${status.credits_limit.toLocaleString()} remaining`,
17
+ resetInfo,
18
+ ].filter(Boolean).join("\n");
19
+ }
20
+ return [
21
+ "Not logged in. Using guest session.",
22
+ `Credits: ${status.credits_remaining} of ${status.credits_limit} remaining (resets daily)`,
23
+ "Tip: Log in for more credits \u2014 free accounts get 50/day.",
24
+ ].join("\n");
25
+ }
26
+ function capitalize(s) {
27
+ return s.charAt(0).toUpperCase() + s.slice(1);
28
+ }
29
+ function formatResetTime(isoString) {
30
+ const date = new Date(isoString);
31
+ return date.toLocaleString("en-US", {
32
+ hour: "numeric",
33
+ minute: "2-digit",
34
+ hour12: true,
35
+ timeZoneName: "short",
36
+ month: "2-digit",
37
+ day: "2-digit",
38
+ year: "numeric",
39
+ });
40
+ }
41
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC;IAE/D,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEvE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB;YACvC,CAAC,CAAC,WAAW,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;YACL,gBAAgB,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;YAChE,YAAY,MAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,YAAY;YAC7G,SAAS;SACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,qCAAqC;QACrC,YAAY,MAAM,CAAC,iBAAiB,OAAO,MAAM,CAAC,aAAa,2BAA2B;QAC1F,+DAA+D;KAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB;IACxC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAClC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,OAAO;QACrB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function upgradeTool(): Promise<string>;
2
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/tools/upgrade.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAQnD"}
@@ -0,0 +1,10 @@
1
+ import { openBrowser } from "../utils/browser.js";
2
+ const PRICING_URL = "https://tinify.ai/pricing";
3
+ export async function upgradeTool() {
4
+ const opened = openBrowser(PRICING_URL);
5
+ if (opened) {
6
+ return "Opened pricing page in browser. Plans: Free (50/day), Pro (3,000/month), Max (10,000/month).";
7
+ }
8
+ return `Open this URL to see pricing: ${PRICING_URL}\nPlans: Free (50/day), Pro (3,000/month), Max (10,000/month).`;
9
+ }
10
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/tools/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,8FAA8F,CAAC;IACxG,CAAC;IAED,OAAO,iCAAiC,WAAW,gEAAgE,CAAC;AACtH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function openBrowser(url: string): boolean;
2
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBhD"}
@@ -0,0 +1,21 @@
1
+ import { exec } from "node:child_process";
2
+ export function openBrowser(url) {
3
+ const platform = process.platform;
4
+ let command;
5
+ if (platform === "darwin") {
6
+ command = `open "${url}"`;
7
+ }
8
+ else if (platform === "win32") {
9
+ command = `start "" "${url}"`;
10
+ }
11
+ else {
12
+ command = `xdg-open "${url}"`;
13
+ }
14
+ let success = true;
15
+ exec(command, (error) => {
16
+ if (error)
17
+ success = false;
18
+ });
19
+ return success;
20
+ }
21
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAAe,CAAC;IAEpB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;IAC5B,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACtB,IAAI,KAAK;YAAE,OAAO,GAAG,KAAK,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinify-ai/mcp-server",
3
- "version": "1.0.5",
3
+ "version": "1.2.0",
4
4
  "description": "MCP server for Tinify image optimization — one tool, max optimization",
5
5
  "type": "module",
6
6
  "bin": {