@tinify-ai/mcp-server 1.2.1 → 1.4.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 +95 -17
- package/dist/api/auth.d.ts +1 -1
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +2 -9
- package/dist/api/auth.js.map +1 -1
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +15 -0
- package/dist/api/client.js.map +1 -1
- package/dist/api/process.d.ts +4 -2
- package/dist/api/process.d.ts.map +1 -1
- package/dist/api/process.js +21 -1
- package/dist/api/process.js.map +1 -1
- package/dist/api/status.d.ts.map +1 -1
- package/dist/api/status.js +19 -4
- package/dist/api/status.js.map +1 -1
- package/dist/api/upload.d.ts +2 -0
- package/dist/api/upload.d.ts.map +1 -1
- package/dist/api/upload.js +1 -1
- package/dist/api/upload.js.map +1 -1
- package/dist/auth/anonymous.d.ts +10 -0
- package/dist/auth/anonymous.d.ts.map +1 -0
- package/dist/auth/anonymous.js +37 -0
- package/dist/auth/anonymous.js.map +1 -0
- package/dist/auth/context.d.ts +13 -0
- package/dist/auth/context.d.ts.map +1 -0
- package/dist/auth/context.js +10 -0
- package/dist/auth/context.js.map +1 -0
- package/dist/auth/jwt.d.ts +7 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +35 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/resolver.d.ts +11 -0
- package/dist/auth/resolver.d.ts.map +1 -0
- package/dist/auth/resolver.js +35 -0
- package/dist/auth/resolver.js.map +1 -0
- package/dist/index.js +195 -155
- package/dist/index.js.map +1 -1
- package/dist/tools/login.js +1 -1
- package/dist/tools/login.js.map +1 -1
- package/dist/tools/optimize.d.ts +12 -2
- package/dist/tools/optimize.d.ts.map +1 -1
- package/dist/tools/optimize.js +95 -15
- package/dist/tools/optimize.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +9 -6
- package/dist/tools/status.js.map +1 -1
- package/dist/transport/http.d.ts +8 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +151 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/x402/client.d.ts +26 -0
- package/dist/x402/client.d.ts.map +1 -0
- package/dist/x402/client.js +73 -0
- package/dist/x402/client.js.map +1 -0
- package/package.json +10 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAA2B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CA2BlD"}
|
package/dist/tools/status.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DEFAULT_BASE_URL } from "../api/client.js";
|
|
1
|
+
import { DEFAULT_BASE_URL, getAuthHeaders } from "../api/client.js";
|
|
3
2
|
import { getAccountStatus } from "../api/auth.js";
|
|
3
|
+
import { isX402Configured, getWalletAddress } from "../x402/client.js";
|
|
4
4
|
export async function statusTool() {
|
|
5
|
-
const sessionManager = new SessionManager();
|
|
6
5
|
const baseUrl = process.env.TINIFY_API_URL ?? DEFAULT_BASE_URL;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
6
|
+
const authHeaders = getAuthHeaders();
|
|
7
|
+
const status = await getAccountStatus(baseUrl, authHeaders);
|
|
8
|
+
const x402Status = isX402Configured()
|
|
9
|
+
? `Pay As You Go: Enabled (wallet: ${await getWalletAddress()})`
|
|
10
|
+
: "Pay As You Go: Not configured (set TINIFY_X402_PRIVATE_KEY)";
|
|
10
11
|
if (status.logged_in) {
|
|
11
12
|
const resetInfo = status.credits_reset_at
|
|
12
13
|
? `Resets: ${formatResetTime(status.credits_reset_at)}`
|
|
@@ -15,11 +16,13 @@ export async function statusTool() {
|
|
|
15
16
|
`Logged in as ${status.email} (${capitalize(status.tier)} tier)`,
|
|
16
17
|
`Credits: ${status.credits_remaining.toLocaleString()} of ${status.credits_limit.toLocaleString()} remaining`,
|
|
17
18
|
resetInfo,
|
|
19
|
+
x402Status,
|
|
18
20
|
].filter(Boolean).join("\n");
|
|
19
21
|
}
|
|
20
22
|
return [
|
|
21
23
|
"Not logged in. Using guest session.",
|
|
22
24
|
`Credits: ${status.credits_remaining} of ${status.credits_limit} remaining (resets daily)`,
|
|
25
|
+
x402Status,
|
|
23
26
|
"Tip: Log in for more credits \u2014 free accounts get 50/day.",
|
|
24
27
|
].join("\n");
|
|
25
28
|
}
|
package/dist/tools/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC;IAC/D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE5D,MAAM,UAAU,GAAG,gBAAgB,EAAE;QACnC,CAAC,CAAC,mCAAmC,MAAM,gBAAgB,EAAE,GAAG;QAChE,CAAC,CAAC,6DAA6D,CAAC;IAElE,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;YACT,UAAU;SACX,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,UAAU;QACV,+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,8 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Starts the HTTP server for remote MCP.
|
|
4
|
+
* @param createServer Factory that creates a new McpServer with tools registered.
|
|
5
|
+
* Called once per session (each client gets its own server instance).
|
|
6
|
+
*/
|
|
7
|
+
export declare function startHttpServer(createServer: () => McpServer): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JlF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import cors from "cors";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5
|
+
import { resolveAuthHeaders } from "../auth/resolver.js";
|
|
6
|
+
import { requestContext } from "../auth/context.js";
|
|
7
|
+
const MAX_SESSIONS = 10_000;
|
|
8
|
+
const SESSION_IDLE_MS = 30 * 60 * 1000; // 30 minutes
|
|
9
|
+
/**
|
|
10
|
+
* Starts the HTTP server for remote MCP.
|
|
11
|
+
* @param createServer Factory that creates a new McpServer with tools registered.
|
|
12
|
+
* Called once per session (each client gets its own server instance).
|
|
13
|
+
*/
|
|
14
|
+
export async function startHttpServer(createServer) {
|
|
15
|
+
const app = express();
|
|
16
|
+
app.use(express.json());
|
|
17
|
+
const sessions = new Map();
|
|
18
|
+
// Periodic cleanup: remove idle sessions every 5 minutes
|
|
19
|
+
const cleanupTimer = setInterval(() => {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
for (const [id, session] of sessions) {
|
|
22
|
+
if (now - session.lastActivity > SESSION_IDLE_MS) {
|
|
23
|
+
session.transport.close();
|
|
24
|
+
sessions.delete(id);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}, 5 * 60 * 1000);
|
|
28
|
+
// CORS for discovery endpoints (browser-based clients)
|
|
29
|
+
app.use("/.well-known", cors());
|
|
30
|
+
// OAuth discovery proxy — MCP clients auto-fetch this to discover auth endpoints
|
|
31
|
+
app.get("/.well-known/oauth-authorization-server", async (_req, res) => {
|
|
32
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
33
|
+
if (!supabaseUrl) {
|
|
34
|
+
res.status(503).json({ error: "OAuth not configured" });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const upstream = await fetch(`${supabaseUrl}/.well-known/oauth-authorization-server/auth/v1`);
|
|
39
|
+
const data = await upstream.json();
|
|
40
|
+
res.json(data);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
res.status(502).json({ error: "Failed to fetch OAuth metadata" });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// Static MCP server card — allows Smithery to scan tools without auth
|
|
47
|
+
app.get("/.well-known/mcp/server-card.json", (_req, res) => {
|
|
48
|
+
res.json({
|
|
49
|
+
serverInfo: { name: "tinify", version: process.env.npm_package_version ?? "1.3.0" },
|
|
50
|
+
authentication: { schemes: ["bearer"], required: false },
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
// Health check
|
|
54
|
+
app.get("/health", (_req, res) => res.json({ status: "ok" }));
|
|
55
|
+
// MCP endpoint — POST (requests), GET (SSE stream), DELETE (session end)
|
|
56
|
+
app.all("/mcp", async (req, res) => {
|
|
57
|
+
const authHeader = req.headers.authorization ?? null;
|
|
58
|
+
const existingSessionId = req.headers["mcp-session-id"];
|
|
59
|
+
// --- Existing session: reuse transport ---
|
|
60
|
+
if (existingSessionId && sessions.has(existingSessionId)) {
|
|
61
|
+
const session = sessions.get(existingSessionId);
|
|
62
|
+
session.lastActivity = Date.now();
|
|
63
|
+
if (req.method === "DELETE") {
|
|
64
|
+
session.transport.close();
|
|
65
|
+
sessions.delete(existingSessionId);
|
|
66
|
+
res.status(200).end();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const authHeaders = await resolveAuthHeaders(authHeader, existingSessionId);
|
|
70
|
+
try {
|
|
71
|
+
await requestContext.run({ authHeaders, sessionId: existingSessionId }, async () => {
|
|
72
|
+
await session.transport.handleRequest(req, res, req.body);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
session.transport.close();
|
|
77
|
+
sessions.delete(existingSessionId);
|
|
78
|
+
if (!res.headersSent) {
|
|
79
|
+
res.status(500).json({ error: "Internal server error" });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// --- Existing session ID but not found: 404 ---
|
|
85
|
+
if (existingSessionId && !sessions.has(existingSessionId)) {
|
|
86
|
+
res.status(404).json({ error: "Session not found or expired" });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// --- New session: create transport + server ---
|
|
90
|
+
// Evict oldest session if at capacity (LRU)
|
|
91
|
+
if (sessions.size >= MAX_SESSIONS) {
|
|
92
|
+
let oldestId = null;
|
|
93
|
+
let oldestTime = Infinity;
|
|
94
|
+
for (const [id, s] of sessions) {
|
|
95
|
+
if (s.lastActivity < oldestTime) {
|
|
96
|
+
oldestTime = s.lastActivity;
|
|
97
|
+
oldestId = id;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (oldestId) {
|
|
101
|
+
sessions.get(oldestId)?.transport.close();
|
|
102
|
+
sessions.delete(oldestId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Pre-generate the session ID so the transport, anonStore, and sessions Map all share the same key.
|
|
106
|
+
// Without this, the anonStore would cache the anonymous JWT under a temp UUID that differs from
|
|
107
|
+
// transport.sessionId, causing a cache miss on every subsequent request.
|
|
108
|
+
const sessionId = randomUUID();
|
|
109
|
+
const transport = new StreamableHTTPServerTransport({
|
|
110
|
+
sessionIdGenerator: () => sessionId,
|
|
111
|
+
});
|
|
112
|
+
const server = createServer();
|
|
113
|
+
await server.connect(transport);
|
|
114
|
+
const authHeaders = await resolveAuthHeaders(authHeader, sessionId);
|
|
115
|
+
try {
|
|
116
|
+
await requestContext.run({ authHeaders, sessionId }, async () => {
|
|
117
|
+
await transport.handleRequest(req, res, req.body);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
transport.close();
|
|
122
|
+
if (!res.headersSent) {
|
|
123
|
+
res.status(500).json({ error: "Internal server error" });
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// Store session after init completes
|
|
128
|
+
sessions.set(sessionId, {
|
|
129
|
+
transport,
|
|
130
|
+
server,
|
|
131
|
+
lastActivity: Date.now(),
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
// Graceful shutdown
|
|
135
|
+
const port = parseInt(process.env.PORT ?? "8080", 10);
|
|
136
|
+
const httpServer = app.listen(port, () => {
|
|
137
|
+
console.error(`Tinify MCP server listening on port ${port} (HTTP mode)`);
|
|
138
|
+
});
|
|
139
|
+
const shutdown = () => {
|
|
140
|
+
console.error("Shutting down: closing active sessions...");
|
|
141
|
+
clearInterval(cleanupTimer);
|
|
142
|
+
for (const [id, session] of sessions) {
|
|
143
|
+
session.transport.close();
|
|
144
|
+
sessions.delete(id);
|
|
145
|
+
}
|
|
146
|
+
httpServer.close();
|
|
147
|
+
};
|
|
148
|
+
process.on("SIGTERM", shutdown);
|
|
149
|
+
process.on("SIGINT", shutdown);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 payment client for MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Wraps fetch with x402 payment handling. When the backend returns 402,
|
|
5
|
+
* automatically signs a USDC payment on Base and retries the request.
|
|
6
|
+
*
|
|
7
|
+
* Wallet private key is read from TINIFY_X402_PRIVATE_KEY env var.
|
|
8
|
+
* The key never leaves this process.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Check if x402 payments are configured (private key env var is set).
|
|
12
|
+
*/
|
|
13
|
+
export declare function isX402Configured(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Get the wallet address (public, safe to display).
|
|
16
|
+
* Returns null if no private key is configured or if derivation fails.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getWalletAddress(): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a fetch function wrapped with x402 payment handling.
|
|
21
|
+
*
|
|
22
|
+
* On first call, initializes the signer from TINIFY_X402_PRIVATE_KEY.
|
|
23
|
+
* Returns null if no private key is configured.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getX402Fetch(): Promise<typeof fetch | null>;
|
|
26
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/x402/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB/D;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,CAsCjE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 payment client for MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Wraps fetch with x402 payment handling. When the backend returns 402,
|
|
5
|
+
* automatically signs a USDC payment on Base and retries the request.
|
|
6
|
+
*
|
|
7
|
+
* Wallet private key is read from TINIFY_X402_PRIVATE_KEY env var.
|
|
8
|
+
* The key never leaves this process.
|
|
9
|
+
*/
|
|
10
|
+
let _wrappedFetch = null;
|
|
11
|
+
let _walletAddress = null;
|
|
12
|
+
/**
|
|
13
|
+
* Check if x402 payments are configured (private key env var is set).
|
|
14
|
+
*/
|
|
15
|
+
export function isX402Configured() {
|
|
16
|
+
return !!process.env.TINIFY_X402_PRIVATE_KEY;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the wallet address (public, safe to display).
|
|
20
|
+
* Returns null if no private key is configured or if derivation fails.
|
|
21
|
+
*/
|
|
22
|
+
export async function getWalletAddress() {
|
|
23
|
+
if (!process.env.TINIFY_X402_PRIVATE_KEY)
|
|
24
|
+
return null;
|
|
25
|
+
if (!_walletAddress) {
|
|
26
|
+
try {
|
|
27
|
+
const { privateKeyToAccount } = await import("viem/accounts");
|
|
28
|
+
const account = privateKeyToAccount(process.env.TINIFY_X402_PRIVATE_KEY);
|
|
29
|
+
_walletAddress = account.address;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return _walletAddress;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get a fetch function wrapped with x402 payment handling.
|
|
39
|
+
*
|
|
40
|
+
* On first call, initializes the signer from TINIFY_X402_PRIVATE_KEY.
|
|
41
|
+
* Returns null if no private key is configured.
|
|
42
|
+
*/
|
|
43
|
+
export async function getX402Fetch() {
|
|
44
|
+
if (!process.env.TINIFY_X402_PRIVATE_KEY)
|
|
45
|
+
return null;
|
|
46
|
+
if (!_wrappedFetch) {
|
|
47
|
+
try {
|
|
48
|
+
const { wrapFetchWithPayment, x402Client } = await import("@x402/fetch");
|
|
49
|
+
const { registerExactEvmScheme } = await import("@x402/evm/exact/client");
|
|
50
|
+
const { toClientEvmSigner } = await import("@x402/evm");
|
|
51
|
+
const { privateKeyToAccount } = await import("viem/accounts");
|
|
52
|
+
const { createPublicClient, http } = await import("viem");
|
|
53
|
+
const { base } = await import("viem/chains");
|
|
54
|
+
const account = privateKeyToAccount(process.env.TINIFY_X402_PRIVATE_KEY);
|
|
55
|
+
// Create a public client for readContract capability
|
|
56
|
+
const publicClient = createPublicClient({
|
|
57
|
+
chain: base,
|
|
58
|
+
transport: http(),
|
|
59
|
+
});
|
|
60
|
+
// Compose a full ClientEvmSigner with readContract from publicClient
|
|
61
|
+
const signer = toClientEvmSigner(account, publicClient);
|
|
62
|
+
const client = new x402Client();
|
|
63
|
+
registerExactEvmScheme(client, { signer });
|
|
64
|
+
_wrappedFetch = wrapFetchWithPayment(fetch, client);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error("Failed to initialize x402 client:", error);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return _wrappedFetch;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/x402/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,IAAI,aAAa,GAAwB,IAAI,CAAC;AAC9C,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAEtD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,mBAAmB,CACjC,OAAO,CAAC,GAAG,CAAC,uBAAwC,CACrD,CAAC;YACF,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAEtD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAC7C,wBAAwB,CACzB,CAAC;YACF,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACxD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC9D,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAG,mBAAmB,CACjC,OAAO,CAAC,GAAG,CAAC,uBAAwC,CACrD,CAAC;YAEF,qDAAqD;YACrD,MAAM,YAAY,GAAG,kBAAkB,CAAC;gBACtC,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI,EAAE;aAClB,CAAC,CAAC;YAEH,qEAAqE;YACrE,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,sBAAsB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAE3C,aAAa,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinify-ai/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "MCP server for Tinify image optimization — one tool, max optimization",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -47,10 +47,19 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
50
|
+
"@supabase/supabase-js": "^2.99.1",
|
|
51
|
+
"@x402/evm": "^2.6.0",
|
|
52
|
+
"@x402/fetch": "^2.6.0",
|
|
53
|
+
"cors": "^2.8.6",
|
|
50
54
|
"eventsource": "^3.0.6",
|
|
55
|
+
"express": "^5.2.1",
|
|
56
|
+
"jose": "^5.10.0",
|
|
57
|
+
"viem": "^2.0.0",
|
|
51
58
|
"zod": "^3.25.0"
|
|
52
59
|
},
|
|
53
60
|
"devDependencies": {
|
|
61
|
+
"@types/cors": "^2.8.19",
|
|
62
|
+
"@types/express": "^5.0.6",
|
|
54
63
|
"@types/node": "^22.0.0",
|
|
55
64
|
"tsx": "^4.19.0",
|
|
56
65
|
"typescript": "^5.9.3",
|