@tinify-ai/mcp-server 1.3.0 → 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 +37 -8
- 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 +3 -2
- package/dist/api/process.d.ts.map +1 -1
- package/dist/api/process.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 -178
- 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 +9 -2
- package/dist/tools/optimize.d.ts.map +1 -1
- package/dist/tools/optimize.js +35 -8
- package/dist/tools/optimize.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +3 -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/package.json +11 -5
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,
|
|
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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"}
|
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,13 +47,19 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
50
|
-
"
|
|
51
|
-
"zod": "^3.25.0",
|
|
52
|
-
"@x402/fetch": "^2.6.0",
|
|
50
|
+
"@supabase/supabase-js": "^2.99.1",
|
|
53
51
|
"@x402/evm": "^2.6.0",
|
|
54
|
-
"
|
|
52
|
+
"@x402/fetch": "^2.6.0",
|
|
53
|
+
"cors": "^2.8.6",
|
|
54
|
+
"eventsource": "^3.0.6",
|
|
55
|
+
"express": "^5.2.1",
|
|
56
|
+
"jose": "^5.10.0",
|
|
57
|
+
"viem": "^2.0.0",
|
|
58
|
+
"zod": "^3.25.0"
|
|
55
59
|
},
|
|
56
60
|
"devDependencies": {
|
|
61
|
+
"@types/cors": "^2.8.19",
|
|
62
|
+
"@types/express": "^5.0.6",
|
|
57
63
|
"@types/node": "^22.0.0",
|
|
58
64
|
"tsx": "^4.19.0",
|
|
59
65
|
"typescript": "^5.9.3",
|