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.
Files changed (2) hide show
  1. package/mcp-server.js +52 -4
  2. 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 --sse --port 8080
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
- const transport = new StdioServerTransport();
124
- await server.connect(transport);
125
- console.error("[remote-agent] MCP 서버 시작 (stdio)");
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.0.0",
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": ["mcp", "remote-control", "screenshot", "automation"]
25
+ "keywords": [
26
+ "mcp",
27
+ "remote-control",
28
+ "screenshot",
29
+ "automation"
30
+ ]
25
31
  }