sweetspot-remote-agent 1.0.0 → 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.
- package/mcp-server.js +52 -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,55 @@ server.tool("sysinfo", "시스템 정보 조회 (OS, CPU, 메모리 등)", {}, a
|
|
|
119
122
|
});
|
|
120
123
|
|
|
121
124
|
// ── 서버 시작 ──
|
|
125
|
+
const args = process.argv.slice(2);
|
|
126
|
+
const isStdio = args.includes("--stdio");
|
|
127
|
+
const portIdx = args.indexOf("--port");
|
|
128
|
+
const port = portIdx !== -1 ? parseInt(args[portIdx + 1], 10) : 8080;
|
|
129
|
+
|
|
122
130
|
async function main() {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
131
|
+
if (!isStdio) {
|
|
132
|
+
// HTTP 모드: 원격 연결용
|
|
133
|
+
const app = express();
|
|
134
|
+
app.use(express.json());
|
|
135
|
+
|
|
136
|
+
// 세션별 transport 관리
|
|
137
|
+
const transports = new Map();
|
|
138
|
+
|
|
139
|
+
app.all("/mcp", async (req, res) => {
|
|
140
|
+
// 새 세션 초기화 (POST + initialize 메서드)
|
|
141
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
142
|
+
|
|
143
|
+
if (!sessionId && req.method === "POST") {
|
|
144
|
+
const transport = new StreamableHTTPServerTransport({
|
|
145
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
146
|
+
});
|
|
147
|
+
transport.onclose = () => {
|
|
148
|
+
if (transport.sessionId) transports.delete(transport.sessionId);
|
|
149
|
+
};
|
|
150
|
+
await server.connect(transport);
|
|
151
|
+
await transport.handleRequest(req, res, req.body);
|
|
152
|
+
if (transport.sessionId) transports.set(transport.sessionId, transport);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// 기존 세션
|
|
157
|
+
if (sessionId && transports.has(sessionId)) {
|
|
158
|
+
await transports.get(sessionId).handleRequest(req, res, req.body);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
res.status(400).json({ error: "Invalid or missing session" });
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
app.listen(port, "0.0.0.0", () => {
|
|
166
|
+
console.error(`[remote-agent] MCP 서버 시작 (HTTP 0.0.0.0:${port})`);
|
|
167
|
+
});
|
|
168
|
+
} else {
|
|
169
|
+
// stdio 모드: 로컬 사용
|
|
170
|
+
const transport = new StdioServerTransport();
|
|
171
|
+
await server.connect(transport);
|
|
172
|
+
console.error("[remote-agent] MCP 서버 시작 (stdio)");
|
|
173
|
+
}
|
|
126
174
|
}
|
|
127
175
|
|
|
128
176
|
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.2.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
|
}
|