sweetspot-remote-agent 1.0.0 → 1.1.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/mcp-server.js +51 -4
- package/package.json +8 -2
package/mcp-server.js
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
* Sweetspot Remote Agent — MCP 서버
|
|
4
4
|
*
|
|
5
5
|
* 로컬 사용: .mcp.json에 추가 (stdio)
|
|
6
|
-
* 원격 사용: node mcp-server.js --
|
|
6
|
+
* 원격 사용: node mcp-server.js --port 8080
|
|
7
7
|
*/
|
|
8
8
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
9
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
10
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
11
|
+
import express from "express";
|
|
12
|
+
import crypto from "crypto";
|
|
10
13
|
import { z } from "zod";
|
|
11
14
|
|
|
12
15
|
import screenshot from "screenshot-desktop";
|
|
@@ -119,10 +122,54 @@ server.tool("sysinfo", "시스템 정보 조회 (OS, CPU, 메모리 등)", {}, a
|
|
|
119
122
|
});
|
|
120
123
|
|
|
121
124
|
// ── 서버 시작 ──
|
|
125
|
+
const args = process.argv.slice(2);
|
|
126
|
+
const portIdx = args.indexOf("--port");
|
|
127
|
+
const port = portIdx !== -1 ? parseInt(args[portIdx + 1], 10) : null;
|
|
128
|
+
|
|
122
129
|
async function main() {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
130
|
+
if (port) {
|
|
131
|
+
// HTTP 모드: 원격 연결용
|
|
132
|
+
const app = express();
|
|
133
|
+
app.use(express.json());
|
|
134
|
+
|
|
135
|
+
// 세션별 transport 관리
|
|
136
|
+
const transports = new Map();
|
|
137
|
+
|
|
138
|
+
app.all("/mcp", async (req, res) => {
|
|
139
|
+
// 새 세션 초기화 (POST + initialize 메서드)
|
|
140
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
141
|
+
|
|
142
|
+
if (!sessionId && req.method === "POST") {
|
|
143
|
+
const transport = new StreamableHTTPServerTransport({
|
|
144
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
145
|
+
});
|
|
146
|
+
transport.onclose = () => {
|
|
147
|
+
if (transport.sessionId) transports.delete(transport.sessionId);
|
|
148
|
+
};
|
|
149
|
+
await server.connect(transport);
|
|
150
|
+
await transport.handleRequest(req, res, req.body);
|
|
151
|
+
if (transport.sessionId) transports.set(transport.sessionId, transport);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 기존 세션
|
|
156
|
+
if (sessionId && transports.has(sessionId)) {
|
|
157
|
+
await transports.get(sessionId).handleRequest(req, res, req.body);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
res.status(400).json({ error: "Invalid or missing session" });
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
app.listen(port, "0.0.0.0", () => {
|
|
165
|
+
console.error(`[remote-agent] MCP 서버 시작 (HTTP 0.0.0.0:${port})`);
|
|
166
|
+
});
|
|
167
|
+
} else {
|
|
168
|
+
// stdio 모드: 로컬 사용
|
|
169
|
+
const transport = new StdioServerTransport();
|
|
170
|
+
await server.connect(transport);
|
|
171
|
+
console.error("[remote-agent] MCP 서버 시작 (stdio)");
|
|
172
|
+
}
|
|
126
173
|
}
|
|
127
174
|
|
|
128
175
|
main().catch((err) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sweetspot-remote-agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Sweetspot 원격 제어 MCP 서버 — 스크린샷, 마우스/키보드, 앱 제어, 셸 실행",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "mcp-server.js",
|
|
@@ -17,9 +17,15 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
20
|
+
"express": "^5.2.1",
|
|
20
21
|
"screenshot-desktop": "^1.15.0",
|
|
21
22
|
"zod": "^4.3.6"
|
|
22
23
|
},
|
|
23
24
|
"license": "ISC",
|
|
24
|
-
"keywords": [
|
|
25
|
+
"keywords": [
|
|
26
|
+
"mcp",
|
|
27
|
+
"remote-control",
|
|
28
|
+
"screenshot",
|
|
29
|
+
"automation"
|
|
30
|
+
]
|
|
25
31
|
}
|