hostinger-api-mcp 0.0.11 → 0.0.12
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 +10 -0
- package/package.json +3 -1
- package/server.js +65 -6
- package/server.ts +67 -7
package/README.md
CHANGED
|
@@ -73,6 +73,16 @@ The following environment variables can be configured when running the server:
|
|
|
73
73
|
}
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
### Using SSE Transport
|
|
77
|
+
|
|
78
|
+
To use the MCP server with SSE transport, you must run the server with the `--sse` option.
|
|
79
|
+
This will enable the server to communicate with clients using Server-Sent Events on localhost port 8100.
|
|
80
|
+
Additionally, you can specify the `--host` and `--port` options to set the host and port for the server to listen on.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
node server.js --see --host 127.0.0.1 --port 8100
|
|
84
|
+
```
|
|
85
|
+
|
|
76
86
|
### Using as an MCP Tool Provider
|
|
77
87
|
|
|
78
88
|
This server implements the Model Context Protocol (MCP) and can be used with any MCP-compatible consumer, like Claude.js client or other MCP consumers.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hostinger-api-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "MCP server for Hostinger API",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
29
|
+
"minimist": "^1.2.8",
|
|
30
|
+
"express": "^5.1.0",
|
|
29
31
|
"axios": "^1.8.0",
|
|
30
32
|
"dotenv": "^16.0.0"
|
|
31
33
|
},
|
package/server.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
6
|
+
import minimist from 'minimist';
|
|
7
|
+
import express from "express";
|
|
5
8
|
import axios from "axios";
|
|
6
9
|
import { config as dotenvConfig } from "dotenv";
|
|
7
10
|
import {
|
|
@@ -1864,7 +1867,7 @@ const SECURITY_SCHEMES = {
|
|
|
1864
1867
|
|
|
1865
1868
|
/**
|
|
1866
1869
|
* MCP Server for Hostinger API
|
|
1867
|
-
* Generated from OpenAPI spec version 0.0.
|
|
1870
|
+
* Generated from OpenAPI spec version 0.0.27
|
|
1868
1871
|
*/
|
|
1869
1872
|
class MCPServer {
|
|
1870
1873
|
constructor() {
|
|
@@ -1882,7 +1885,7 @@ class MCPServer {
|
|
|
1882
1885
|
this.server = new Server(
|
|
1883
1886
|
{
|
|
1884
1887
|
name: "hostinger-api-mcp",
|
|
1885
|
-
version: "0.0.
|
|
1888
|
+
version: "0.0.12",
|
|
1886
1889
|
},
|
|
1887
1890
|
{
|
|
1888
1891
|
capabilities: {
|
|
@@ -1907,7 +1910,7 @@ class MCPServer {
|
|
|
1907
1910
|
});
|
|
1908
1911
|
}
|
|
1909
1912
|
|
|
1910
|
-
headers['User-Agent'] = 'hostinger-mcp-server/0.0.
|
|
1913
|
+
headers['User-Agent'] = 'hostinger-mcp-server/0.0.12';
|
|
1911
1914
|
|
|
1912
1915
|
return headers;
|
|
1913
1916
|
}
|
|
@@ -2158,10 +2161,52 @@ class MCPServer {
|
|
|
2158
2161
|
}
|
|
2159
2162
|
}
|
|
2160
2163
|
|
|
2164
|
+
/**
|
|
2165
|
+
* Start the sse server
|
|
2166
|
+
*/
|
|
2167
|
+
async startSse(host, port) {
|
|
2168
|
+
try {
|
|
2169
|
+
// Create sse transport
|
|
2170
|
+
const app = express();
|
|
2171
|
+
app.use(express.json());
|
|
2172
|
+
|
|
2173
|
+
let transport = null;
|
|
2174
|
+
const sessions = {};
|
|
2175
|
+
|
|
2176
|
+
app.get('/sse', (req, res) => {
|
|
2177
|
+
transport = new SSEServerTransport('/messages', res);
|
|
2178
|
+
sessions[transport.sessionId] = transport;
|
|
2179
|
+
|
|
2180
|
+
res.on('close', () => {
|
|
2181
|
+
delete sessions[transport.sessionId];
|
|
2182
|
+
});
|
|
2183
|
+
|
|
2184
|
+
this.server.connect(transport);
|
|
2185
|
+
});
|
|
2186
|
+
|
|
2187
|
+
app.post('/messages', (req, res) => {
|
|
2188
|
+
const sessionId = req.query.sessionId;
|
|
2189
|
+
const transport = sessions[sessionId];
|
|
2190
|
+
if (transport) {
|
|
2191
|
+
transport.handlePostMessage(req, res);
|
|
2192
|
+
} else {
|
|
2193
|
+
res.status(400).send('No transport found for sessionId');
|
|
2194
|
+
}
|
|
2195
|
+
});
|
|
2196
|
+
|
|
2197
|
+
app.listen(port, host);
|
|
2198
|
+
this.log('info', `MCP Server with SSE transport started successfully with ${this.tools.size} tools`);
|
|
2199
|
+
this.log('info', `Listening on ${host}:${port}`);
|
|
2200
|
+
} catch (error) {
|
|
2201
|
+
console.error("Failed to start MCP server:", error);
|
|
2202
|
+
process.exit(1);
|
|
2203
|
+
}
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2161
2206
|
/**
|
|
2162
2207
|
* Start the server
|
|
2163
2208
|
*/
|
|
2164
|
-
async
|
|
2209
|
+
async startStdio() {
|
|
2165
2210
|
try {
|
|
2166
2211
|
// Create stdio transport
|
|
2167
2212
|
const transport = new StdioServerTransport();
|
|
@@ -2172,7 +2217,7 @@ class MCPServer {
|
|
|
2172
2217
|
|
|
2173
2218
|
// Now we can safely log via MCP
|
|
2174
2219
|
console.error(`Registered ${this.tools.size} tools`);
|
|
2175
|
-
this.log('info', `MCP Server started successfully with ${this.tools.size} tools`);
|
|
2220
|
+
this.log('info', `MCP Server with stdio transport started successfully with ${this.tools.size} tools`);
|
|
2176
2221
|
} catch (error) {
|
|
2177
2222
|
console.error("Failed to start MCP server:", error);
|
|
2178
2223
|
process.exit(1);
|
|
@@ -2183,8 +2228,22 @@ class MCPServer {
|
|
|
2183
2228
|
// Start the server
|
|
2184
2229
|
async function main() {
|
|
2185
2230
|
try {
|
|
2231
|
+
const argv = minimist(process.argv.slice(2), {
|
|
2232
|
+
string: ['host'],
|
|
2233
|
+
int: ['port'],
|
|
2234
|
+
boolean: ['sse'],
|
|
2235
|
+
default: {
|
|
2236
|
+
host: '127.0.0.1',
|
|
2237
|
+
port: 8100,
|
|
2238
|
+
}
|
|
2239
|
+
});
|
|
2240
|
+
|
|
2186
2241
|
const server = new MCPServer();
|
|
2187
|
-
|
|
2242
|
+
if (argv.sse) {
|
|
2243
|
+
await server.startSse(argv.host, argv.port);
|
|
2244
|
+
} else {
|
|
2245
|
+
await server.startStdio();
|
|
2246
|
+
}
|
|
2188
2247
|
} catch (error) {
|
|
2189
2248
|
console.error("Failed to start server:", error);
|
|
2190
2249
|
process.exit(1);
|
package/server.ts
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
6
|
+
import express from "express";
|
|
7
|
+
import {Request, Response} from "express";
|
|
5
8
|
import axios, { AxiosRequestConfig, AxiosError, AxiosResponse } from "axios";
|
|
6
9
|
import { config as dotenvConfig } from "dotenv";
|
|
7
10
|
import {
|
|
@@ -1880,7 +1883,7 @@ const SECURITY_SCHEMES: Record<string, SecurityScheme> = {
|
|
|
1880
1883
|
|
|
1881
1884
|
/**
|
|
1882
1885
|
* MCP Server for Hostinger API
|
|
1883
|
-
* Generated from OpenAPI spec version 0.0.
|
|
1886
|
+
* Generated from OpenAPI spec version 0.0.27
|
|
1884
1887
|
*/
|
|
1885
1888
|
class MCPServer {
|
|
1886
1889
|
private server: Server;
|
|
@@ -1902,7 +1905,7 @@ class MCPServer {
|
|
|
1902
1905
|
this.server = new Server(
|
|
1903
1906
|
{
|
|
1904
1907
|
name: "hostinger-api-mcp",
|
|
1905
|
-
version: "0.0.
|
|
1908
|
+
version: "0.0.12",
|
|
1906
1909
|
},
|
|
1907
1910
|
{
|
|
1908
1911
|
capabilities: {
|
|
@@ -1927,7 +1930,7 @@ class MCPServer {
|
|
|
1927
1930
|
});
|
|
1928
1931
|
}
|
|
1929
1932
|
|
|
1930
|
-
headers['User-Agent'] = 'hostinger-mcp-server/0.0.
|
|
1933
|
+
headers['User-Agent'] = 'hostinger-mcp-server/0.0.12';
|
|
1931
1934
|
|
|
1932
1935
|
return headers;
|
|
1933
1936
|
}
|
|
@@ -2182,11 +2185,53 @@ class MCPServer {
|
|
|
2182
2185
|
}
|
|
2183
2186
|
}
|
|
2184
2187
|
}
|
|
2188
|
+
|
|
2189
|
+
/**
|
|
2190
|
+
* Start the sse server
|
|
2191
|
+
*/
|
|
2192
|
+
async startSse(host: string, port: number): Promise<void> {
|
|
2193
|
+
try {
|
|
2194
|
+
// Create sse transport
|
|
2195
|
+
const app = express();
|
|
2196
|
+
app.use(express.json());
|
|
2197
|
+
|
|
2198
|
+
let transport: SSEServerTransport;
|
|
2199
|
+
const sessions = {} as Record<string, SSEServerTransport>;
|
|
2200
|
+
|
|
2201
|
+
app.get('/sse', (req: Request, res: Response) => {
|
|
2202
|
+
transport = new SSEServerTransport('/messages', res);
|
|
2203
|
+
sessions[transport.sessionId] = transport;
|
|
2204
|
+
|
|
2205
|
+
res.on('close', () => {
|
|
2206
|
+
delete sessions[transport.sessionId];
|
|
2207
|
+
});
|
|
2208
|
+
|
|
2209
|
+
this.server.connect(transport);
|
|
2210
|
+
});
|
|
2211
|
+
|
|
2212
|
+
app.post('/messages', (req: Request, res: Response) => {
|
|
2213
|
+
const sessionId = req.query.sessionId as string;
|
|
2214
|
+
const transport = sessions[sessionId];
|
|
2215
|
+
if (transport) {
|
|
2216
|
+
transport.handlePostMessage(req, res);
|
|
2217
|
+
} else {
|
|
2218
|
+
res.status(400).send('No transport found for sessionId');
|
|
2219
|
+
}
|
|
2220
|
+
});
|
|
2221
|
+
|
|
2222
|
+
app.listen(port, host);
|
|
2223
|
+
this.log('info', `MCP Server with SSE transport started successfully with ${this.tools.size} tools`);
|
|
2224
|
+
this.log('info', `Listening on ${host}:${port}`);
|
|
2225
|
+
} catch (error) {
|
|
2226
|
+
console.error("Failed to start MCP server:", error);
|
|
2227
|
+
process.exit(1);
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2185
2230
|
|
|
2186
2231
|
/**
|
|
2187
|
-
* Start the server
|
|
2232
|
+
* Start the stdio server
|
|
2188
2233
|
*/
|
|
2189
|
-
async
|
|
2234
|
+
async startStdio(): Promise<void> {
|
|
2190
2235
|
try {
|
|
2191
2236
|
// Create stdio transport
|
|
2192
2237
|
const transport = new StdioServerTransport();
|
|
@@ -2197,7 +2242,7 @@ class MCPServer {
|
|
|
2197
2242
|
|
|
2198
2243
|
// Now we can safely log via MCP
|
|
2199
2244
|
console.error(`Registered ${this.tools.size} tools`);
|
|
2200
|
-
this.log('info', `MCP Server started successfully with ${this.tools.size} tools`);
|
|
2245
|
+
this.log('info', `MCP Server with stdio transport started successfully with ${this.tools.size} tools`);
|
|
2201
2246
|
} catch (error) {
|
|
2202
2247
|
console.error("Failed to start MCP server:", error);
|
|
2203
2248
|
process.exit(1);
|
|
@@ -2208,8 +2253,23 @@ class MCPServer {
|
|
|
2208
2253
|
// Start the server
|
|
2209
2254
|
async function main(): Promise<void> {
|
|
2210
2255
|
try {
|
|
2256
|
+
const argv = minimist(process.argv.slice(2), {
|
|
2257
|
+
string: ['host'],
|
|
2258
|
+
int: ['port'],
|
|
2259
|
+
boolean: ['sse'],
|
|
2260
|
+
default: {
|
|
2261
|
+
host: '127.0.0.1',
|
|
2262
|
+
port: 8100,
|
|
2263
|
+
}
|
|
2264
|
+
});
|
|
2265
|
+
|
|
2211
2266
|
const server = new MCPServer();
|
|
2212
|
-
|
|
2267
|
+
|
|
2268
|
+
if (argv.sse) {
|
|
2269
|
+
await server.startSse(argv.host, argv.port);
|
|
2270
|
+
} else {
|
|
2271
|
+
await server.startStdio();
|
|
2272
|
+
}
|
|
2213
2273
|
} catch (error) {
|
|
2214
2274
|
console.error("Failed to start server:", error);
|
|
2215
2275
|
process.exit(1);
|