mcp-pachca 0.3.0 → 0.5.1

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.
@@ -0,0 +1 @@
1
+ export declare function runConvert(dumpDir: string): void;
@@ -0,0 +1,100 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ function stderrln(msg = "") {
4
+ process.stderr.write(msg + "\n");
5
+ }
6
+ function sanitizeName(name) {
7
+ return name
8
+ .replace(/[/\\:*?"<>|]/g, "_")
9
+ .replace(/\s+/g, "_")
10
+ .slice(0, 100);
11
+ }
12
+ function toReply(m) {
13
+ return {
14
+ id: m.id,
15
+ user_id: m.user_id,
16
+ text: m.text ?? "",
17
+ created_at: m.created_at,
18
+ has_files: (m.files?.length ?? 0) > 0,
19
+ file_names: (m.files ?? []).map((f) => f.name),
20
+ };
21
+ }
22
+ function toConverted(m) {
23
+ return {
24
+ id: m.id,
25
+ user_id: m.user_id,
26
+ text: m.text ?? "",
27
+ created_at: m.created_at,
28
+ has_files: (m.files?.length ?? 0) > 0,
29
+ file_names: (m.files ?? []).map((f) => f.name),
30
+ reactions: (m.reactions ?? []).map((r) => r.code),
31
+ pinned: m.pinned,
32
+ };
33
+ }
34
+ export function runConvert(dumpDir) {
35
+ if (!fs.existsSync(dumpDir)) {
36
+ stderrln(`Error: Directory not found: ${dumpDir}`);
37
+ process.exit(1);
38
+ }
39
+ const indexPath = path.join(dumpDir, "index.json");
40
+ if (!fs.existsSync(indexPath)) {
41
+ stderrln(`Error: index.json not found in ${dumpDir}`);
42
+ stderrln("Make sure this is a valid pachca dump directory.");
43
+ process.exit(1);
44
+ }
45
+ const chats = JSON.parse(fs.readFileSync(indexPath, "utf8"));
46
+ const outDir = path.join(dumpDir, "converted");
47
+ fs.mkdirSync(outDir, { recursive: true });
48
+ let totalChats = 0;
49
+ let totalMessages = 0;
50
+ let totalThreadMessages = 0;
51
+ const chatsDir = path.join(dumpDir, "chats");
52
+ const threadsDir = path.join(dumpDir, "threads");
53
+ for (const chat of chats) {
54
+ const chatFile = path.join(chatsDir, `${chat.id}.json`);
55
+ if (!fs.existsSync(chatFile))
56
+ continue;
57
+ const messages = JSON.parse(fs.readFileSync(chatFile, "utf8"));
58
+ // Load all threads for this chat into a map: thread_id → messages[]
59
+ const threadMessages = new Map();
60
+ const chatThreadsDir = path.join(threadsDir, String(chat.id));
61
+ if (fs.existsSync(chatThreadsDir)) {
62
+ for (const tf of fs.readdirSync(chatThreadsDir)) {
63
+ if (!tf.endsWith(".json"))
64
+ continue;
65
+ const threadId = parseInt(tf.replace(".json", ""), 10);
66
+ const tMsgs = JSON.parse(fs.readFileSync(path.join(chatThreadsDir, tf), "utf8"));
67
+ tMsgs.sort((a, b) => a.id - b.id);
68
+ threadMessages.set(threadId, tMsgs);
69
+ }
70
+ }
71
+ // Build JSONL: one line per message, thread replies inlined
72
+ const safeName = sanitizeName(chat.name || `chat_${chat.id}`);
73
+ const outPath = path.join(outDir, `${chat.id}_${safeName}.json`);
74
+ messages.sort((a, b) => a.id - b.id);
75
+ const lines = [];
76
+ for (const m of messages) {
77
+ const converted = toConverted(m);
78
+ // Attach thread replies inline
79
+ if (m.thread_id && m.thread_message_count > 0) {
80
+ const replies = threadMessages.get(m.thread_id);
81
+ if (replies && replies.length > 0) {
82
+ converted.thread = replies.map(toReply);
83
+ totalThreadMessages += replies.length;
84
+ }
85
+ }
86
+ lines.push(JSON.stringify(converted));
87
+ totalMessages++;
88
+ }
89
+ fs.writeFileSync(outPath, lines.join("\n") + "\n", "utf8");
90
+ totalChats++;
91
+ const threadCount = threadMessages.size;
92
+ const threadSuffix = threadCount > 0 ? ` (${threadCount} threads)` : "";
93
+ stderrln(` ${chat.id}_${safeName}.json — ${messages.length} msgs${threadSuffix}`);
94
+ }
95
+ stderrln("");
96
+ stderrln(`Converted ${totalChats} chats → ${outDir}/`);
97
+ stderrln(` Messages: ${totalMessages.toLocaleString("en-US")}`);
98
+ stderrln(` Thread replies: ${totalThreadMessages.toLocaleString("en-US")}`);
99
+ }
100
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
package/dist/dump.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function runDump(outputDir?: string): Promise<void>;
package/dist/dump.js ADDED
@@ -0,0 +1,237 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { loadSession } from "./auth.js";
4
+ import { PachcaClient } from "./client.js";
5
+ function stderr(msg) {
6
+ process.stderr.write(msg);
7
+ }
8
+ function stderrln(msg = "") {
9
+ process.stderr.write(msg + "\n");
10
+ }
11
+ function sleep(ms) {
12
+ return new Promise((resolve) => setTimeout(resolve, ms));
13
+ }
14
+ function formatNumber(n) {
15
+ return n.toLocaleString("en-US");
16
+ }
17
+ function progressBar(current, total, width = 20) {
18
+ const ratio = Math.min(current / total, 1);
19
+ const filled = Math.round(ratio * width);
20
+ return "█".repeat(filled) + "░".repeat(width - filled);
21
+ }
22
+ function dateSuffix() {
23
+ const d = new Date();
24
+ const y = d.getFullYear();
25
+ const m = String(d.getMonth() + 1).padStart(2, "0");
26
+ const day = String(d.getDate()).padStart(2, "0");
27
+ return `${y}${m}${day}`;
28
+ }
29
+ let interrupted = false;
30
+ async function fetchWithRetry(fn, retries = 3) {
31
+ for (let attempt = 1; attempt <= retries; attempt++) {
32
+ try {
33
+ return await fn();
34
+ }
35
+ catch (err) {
36
+ const msg = err instanceof Error ? err.message : String(err);
37
+ const isRetryable = /HTTP (429|5\d{2})/.test(msg) || msg.includes("timeout");
38
+ if (attempt === retries || !isRetryable)
39
+ throw err;
40
+ const delay = 1000 * Math.pow(2, attempt - 1);
41
+ stderrln(` Retry ${attempt}/${retries} in ${delay}ms: ${msg}`);
42
+ await sleep(delay);
43
+ }
44
+ }
45
+ throw new Error("unreachable");
46
+ }
47
+ async function fetchAllChats(client) {
48
+ const foldersRes = await fetchWithRetry(() => client.get("/menu/folders"));
49
+ const folders = foldersRes?.data ?? [];
50
+ const allChats = [];
51
+ for (const folder of folders) {
52
+ let cursor;
53
+ let folderCount = 0;
54
+ do {
55
+ const params = {};
56
+ if (cursor)
57
+ params["cursor"] = cursor;
58
+ const res = await fetchWithRetry(() => client.get(`/menu/folders/${folder.id}/chats`, params));
59
+ const records = (res?.data ?? []);
60
+ allChats.push(...records);
61
+ folderCount += records.length;
62
+ // Check pagination in both possible fields
63
+ const pag = res?.meta ?? res?.paginate;
64
+ cursor = pag?.cursor ?? undefined;
65
+ if (pag?.has_next && cursor) {
66
+ await sleep(100);
67
+ }
68
+ else {
69
+ break;
70
+ }
71
+ } while (!interrupted);
72
+ stderrln(` ${folder.kind}: ${folderCount} chats`);
73
+ }
74
+ return { chats: allChats, folders };
75
+ }
76
+ async function fetchAllMessages(client, chatId, progressPrefix) {
77
+ const seen = new Map();
78
+ let anchorId;
79
+ while (!interrupted) {
80
+ const params = {
81
+ chat_id: String(chatId),
82
+ per: "100",
83
+ };
84
+ if (anchorId !== undefined) {
85
+ params["message_id"] = String(anchorId);
86
+ params["direction"] = "around";
87
+ }
88
+ const messages = await fetchWithRetry(() => client.get("/messages", params));
89
+ const batch = messages ?? [];
90
+ if (!Array.isArray(batch) || batch.length === 0)
91
+ break;
92
+ for (const m of batch) {
93
+ seen.set(m.id, m);
94
+ }
95
+ // Find the oldest message ID for next page
96
+ const oldestId = batch.reduce((min, m) => m.id < min ? m.id : min, batch[0].id);
97
+ if (oldestId === anchorId)
98
+ break; // no progress — reached beginning
99
+ anchorId = oldestId;
100
+ // Update inline progress
101
+ if (progressPrefix) {
102
+ stderr(`\r ${progressPrefix}: ${formatNumber(seen.size)}...`);
103
+ }
104
+ await sleep(100);
105
+ }
106
+ return [...seen.values()];
107
+ }
108
+ export async function runDump(outputDir) {
109
+ interrupted = false;
110
+ const session = loadSession();
111
+ if (!session) {
112
+ stderrln("Error: No Pachca session found.");
113
+ stderrln("Run: npx mcp-pachca --setup");
114
+ process.exit(1);
115
+ }
116
+ const client = new PachcaClient(session);
117
+ // Handle Ctrl+C gracefully
118
+ const onInterrupt = () => {
119
+ if (interrupted) {
120
+ stderrln("\nForce quit.");
121
+ process.exit(1);
122
+ }
123
+ interrupted = true;
124
+ stderrln("\n\nInterrupted — saving what we have...");
125
+ };
126
+ process.on("SIGINT", onInterrupt);
127
+ // Fetch profile
128
+ const profile = await fetchWithRetry(() => client.get("/profile"));
129
+ // Try to get user name from /users endpoint
130
+ let userName = "unknown";
131
+ if (profile?.id) {
132
+ try {
133
+ const usersRes = await client.getWithArrayParams("/users", { ids: [profile.id] });
134
+ const user = usersRes?.data?.[0];
135
+ if (user) {
136
+ userName = user.display_name || `${user.name} ${user.last_name}`.trim();
137
+ }
138
+ }
139
+ catch {
140
+ // Ignore — we'll use "unknown"
141
+ }
142
+ }
143
+ stderrln(`Pachca dump — user: ${userName} (id: ${profile?.id ?? "?"})\n`);
144
+ // Fetch all chats
145
+ stderrln("Fetching chats...");
146
+ const { chats } = await fetchAllChats(client);
147
+ // Deduplicate chats (same chat can appear in multiple folders)
148
+ const uniqueChats = [...new Map(chats.map((c) => [c.id, c])).values()];
149
+ stderrln(`Total: ${uniqueChats.length} chats\n`);
150
+ if (uniqueChats.length === 0) {
151
+ stderrln("No chats found.");
152
+ return;
153
+ }
154
+ // Create output directory
155
+ const dir = outputDir ?? `pachca_dump_${dateSuffix()}`;
156
+ const chatsDir = path.join(dir, "chats");
157
+ const threadsDir = path.join(dir, "threads");
158
+ fs.mkdirSync(chatsDir, { recursive: true });
159
+ fs.mkdirSync(threadsDir, { recursive: true });
160
+ // Save profile
161
+ fs.writeFileSync(path.join(dir, "profile.json"), JSON.stringify({ ...profile, resolved_name: userName }, null, 2) + "\n");
162
+ // Save chat index
163
+ fs.writeFileSync(path.join(dir, "index.json"), JSON.stringify(uniqueChats, null, 2) + "\n");
164
+ // Dump messages for each chat
165
+ stderrln("Dumping messages...");
166
+ let totalMessages = 0;
167
+ let totalThreadMessages = 0;
168
+ let totalThreads = 0;
169
+ for (let i = 0; i < uniqueChats.length; i++) {
170
+ if (interrupted)
171
+ break;
172
+ const chat = uniqueChats[i];
173
+ const label = chat.name || (chat.personal ? `DM #${chat.id}` : `Chat #${chat.id}`);
174
+ const progress = `[${i + 1}/${uniqueChats.length}]`;
175
+ stderr(`\r ${progress} ${label.slice(0, 40).padEnd(40)} ${progressBar(i, uniqueChats.length)} `);
176
+ try {
177
+ const messages = await fetchAllMessages(client, chat.id, "Messages");
178
+ totalMessages += messages.length;
179
+ // Save messages (chronological order)
180
+ messages.sort((a, b) => a.id - b.id);
181
+ fs.writeFileSync(path.join(chatsDir, `${chat.id}.json`), JSON.stringify(messages, null, 2) + "\n");
182
+ // Collect thread IDs from messages
183
+ const threadIds = new Set();
184
+ for (const m of messages) {
185
+ if (m.thread_id && m.thread_message_count > 0) {
186
+ threadIds.add(m.thread_id);
187
+ }
188
+ }
189
+ // Fetch threads
190
+ let chatThreadMsgs = 0;
191
+ if (threadIds.size > 0) {
192
+ const chatThreadsDir = path.join(threadsDir, String(chat.id));
193
+ fs.mkdirSync(chatThreadsDir, { recursive: true });
194
+ let tIdx = 0;
195
+ for (const threadId of threadIds) {
196
+ if (interrupted)
197
+ break;
198
+ tIdx++;
199
+ try {
200
+ // Get thread metadata to find the thread's chat_id
201
+ const threadInfo = await fetchWithRetry(() => client.get(`/threads/${threadId}`));
202
+ const threadChatId = threadInfo?.data?.chat_id;
203
+ if (!threadChatId)
204
+ continue;
205
+ stderr(`\r ${progress} ${label.slice(0, 30).padEnd(30)} threads ${tIdx}/${threadIds.size}...`);
206
+ const threadMsgs = await fetchAllMessages(client, threadChatId);
207
+ threadMsgs.sort((a, b) => a.id - b.id);
208
+ fs.writeFileSync(path.join(chatThreadsDir, `${threadId}.json`), JSON.stringify(threadMsgs, null, 2) + "\n");
209
+ chatThreadMsgs += threadMsgs.length;
210
+ await sleep(100);
211
+ }
212
+ catch (err) {
213
+ const errMsg = err instanceof Error ? err.message : String(err);
214
+ if (!/HTTP (403|404)/.test(errMsg)) {
215
+ stderr(`\r ${progress} thread ${threadId}: ${errMsg.slice(0, 60)}\n`);
216
+ }
217
+ }
218
+ }
219
+ totalThreads += threadIds.size;
220
+ totalThreadMessages += chatThreadMsgs;
221
+ }
222
+ // Clear the line and show result
223
+ const threadSuffix = chatThreadMsgs > 0
224
+ ? ` + ${formatNumber(chatThreadMsgs)} in ${threadIds.size} threads`
225
+ : "";
226
+ stderr(`\r ${progress} ${label.slice(0, 40).padEnd(40)} ${formatNumber(messages.length).padStart(8)} msgs${threadSuffix}\n`);
227
+ }
228
+ catch (err) {
229
+ const msg = err instanceof Error ? err.message : String(err);
230
+ stderr(`\r ${progress} ${label.slice(0, 40).padEnd(40)} ERROR: ${msg.slice(0, 50)}\n`);
231
+ }
232
+ await sleep(300);
233
+ }
234
+ stderrln(`\nDone! ${uniqueChats.length} chats, ${formatNumber(totalMessages)} messages, ${formatNumber(totalThreads)} threads (${formatNumber(totalThreadMessages)} thread msgs) → ./${dir}/`);
235
+ process.removeListener("SIGINT", onInterrupt);
236
+ }
237
+ //# sourceMappingURL=dump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump.js","sourceRoot":"","sources":["../src/dump.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,11 +9,23 @@ async function main() {
9
9
  await runSetup();
10
10
  process.exit(0);
11
11
  }
12
- const session = loadSession();
13
- if (!session) {
14
- logger.error("No session found. Run: npx mcp-pachca --setup");
15
- process.exit(1);
12
+ if (process.argv[2] === "--dump") {
13
+ process.env["MCP_PACHCA_QUIET"] = "1";
14
+ const { runDump } = await import("./dump.js");
15
+ await runDump(process.argv[3]);
16
+ process.exit(0);
16
17
  }
18
+ if (process.argv[2] === "--convert") {
19
+ if (!process.argv[3]) {
20
+ process.stderr.write("Usage: mcp-pachca --convert <dump_directory>\n");
21
+ process.stderr.write("Example: mcp-pachca --convert ./pachca_dump_20260324\n");
22
+ process.exit(1);
23
+ }
24
+ const { runConvert } = await import("./convert.js");
25
+ runConvert(process.argv[3]);
26
+ process.exit(0);
27
+ }
28
+ const session = loadSession();
17
29
  const server = createServer(session);
18
30
  const transport = new StdioServerTransport();
19
31
  const shutdown = async (signal) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,iBAAiB,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CACxB,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CACH,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CACzB,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAChC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/logger.js CHANGED
@@ -20,7 +20,9 @@ export const logger = {
20
20
  process.stderr.write(formatLog("error", message, data) + "\n");
21
21
  },
22
22
  debug(message, data) {
23
- process.stderr.write(formatLog("debug", message, data) + "\n");
23
+ if (!process.env["MCP_PACHCA_QUIET"]) {
24
+ process.stderr.write(formatLog("debug", message, data) + "\n");
25
+ }
24
26
  },
25
27
  };
26
28
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,SAAS,SAAS,CAAC,KAAa,EAAE,OAAe,EAAE,IAAc;IAC/D,MAAM,KAAK,GAA4B;QACrC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG,EAAE,OAAO;KACb,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,CAAC,OAAO,EAAE,IAAI;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,IAAI;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,IAAI;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,IAAI;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,SAAS,SAAS,CAAC,KAAa,EAAE,OAAe,EAAE,IAAc;IAC/D,MAAM,KAAK,GAA4B;QACrC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG,EAAE,OAAO;KACb,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,CAAC,OAAO,EAAE,IAAI;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,IAAI;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,IAAI;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,IAAI;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
2
  import type { Session } from "./auth.js";
3
- export declare function createServer(session: Session): Server;
3
+ export declare function createServer(session: Session | null): Server;
package/dist/server.js CHANGED
@@ -5,12 +5,23 @@ import { toolDefinitions } from "./tools/schemas.js";
5
5
  import { handlerRegistry } from "./tools/handlers.js";
6
6
  import { logger } from "./logger.js";
7
7
  export function createServer(session) {
8
- const client = new PachcaClient(session);
9
- const server = new Server({ name: "mcp-pachca", version: "0.3.0" }, { capabilities: { tools: {} } });
8
+ const client = session ? new PachcaClient(session) : null;
9
+ const server = new Server({ name: "mcp-pachca", version: "0.4.0" }, { capabilities: { tools: {} } });
10
10
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
11
11
  tools: toolDefinitions,
12
12
  }));
13
13
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
14
+ if (!client) {
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: "No active session. Run: npx mcp-pachca --setup",
20
+ },
21
+ ],
22
+ isError: true,
23
+ };
24
+ }
14
25
  const { name, arguments: args } = request.params;
15
26
  const handler = handlerRegistry[name];
16
27
  if (!handler) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,eAAe;KACvB,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;gBACnE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,eAAe;KACvB,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gDAAgD;qBACvD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;gBACnE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;YACxE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "mcp-pachca",
3
- "version": "0.3.0",
3
+ "version": "0.5.1",
4
4
  "description": "MCP server for Pachca corporate messenger",
5
5
  "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
6
9
  "main": "./dist/index.js",
7
10
  "bin": {
8
11
  "mcp-pachca": "./dist/index.js"
package/.mcp.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "mcpServers": {
3
- "pachca": {
4
- "type": "stdio",
5
- "command": "node",
6
- "args": [
7
- "dist/index.js"
8
- ]
9
- }
10
- }
11
- }
package/src/auth.ts DELETED
@@ -1,128 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import * as os from "node:os";
4
- import { logger } from "./logger.js";
5
-
6
- export interface Session {
7
- email: string;
8
- jwt: string;
9
- workspaceJwt: string;
10
- profileId: number;
11
- companyId: number;
12
- cookies: string[];
13
- createdAt: string;
14
- }
15
-
16
- const BASE_URL = "https://app.pachca.com/api/v3";
17
-
18
- export function getSessionPath(): string {
19
- return path.join(os.homedir(), ".config", "mcp-pachca", "session.json");
20
- }
21
-
22
- export function loadSession(): Session | null {
23
- const p = getSessionPath();
24
- try {
25
- const raw = fs.readFileSync(p, "utf8");
26
- const data = JSON.parse(raw) as Record<string, unknown>;
27
- if (
28
- typeof data.email !== "string" ||
29
- typeof data.jwt !== "string" ||
30
- typeof data.workspaceJwt !== "string" ||
31
- typeof data.profileId !== "number" ||
32
- typeof data.companyId !== "number" ||
33
- !Array.isArray(data.cookies) ||
34
- !data.cookies.every((c: unknown) => typeof c === "string")
35
- ) {
36
- return null;
37
- }
38
- return data as unknown as Session;
39
- } catch (err: unknown) {
40
- if (err instanceof Error && (!("code" in err) || (err as NodeJS.ErrnoException).code !== "ENOENT")) {
41
- logger.error("Failed to load session", { error: String(err) });
42
- }
43
- return null;
44
- }
45
- }
46
-
47
- export function saveSession(session: Session): void {
48
- const p = getSessionPath();
49
- fs.mkdirSync(path.dirname(p), { recursive: true, mode: 0o700 });
50
- fs.writeFileSync(p, JSON.stringify(session, null, 2) + "\n", { encoding: "utf8", mode: 0o600 });
51
- }
52
-
53
- export async function requestOTP(email: string): Promise<void> {
54
- const res = await fetch(`${BASE_URL}/account/code`, {
55
- method: "POST",
56
- headers: { "Content-Type": "application/json" },
57
- body: JSON.stringify({ email, reason: "login", retry: false }),
58
- });
59
- if (!res.ok) {
60
- const body = await res.text();
61
- throw new Error(`Failed to request OTP (HTTP ${res.status}): ${body}`);
62
- }
63
- }
64
-
65
- export async function performLogin(
66
- email: string,
67
- code: string,
68
- ): Promise<Session> {
69
- // Step 1: Login with OTP code
70
- const loginRes = await fetch(`${BASE_URL}/account/login`, {
71
- method: "POST",
72
- headers: { "Content-Type": "application/json" },
73
- body: JSON.stringify({ email, code }),
74
- });
75
- if (!loginRes.ok) {
76
- const body = await loginRes.text();
77
- throw new Error(`Login failed (HTTP ${loginRes.status}): ${body}`);
78
- }
79
-
80
- const cookies = loginRes.headers.getSetCookie?.() ?? [];
81
- const loginData = (await loginRes.json()) as {
82
- jwt: string;
83
- account_id: number;
84
- };
85
- const { jwt } = loginData;
86
-
87
- // Step 2: Get workspaces using account JWT
88
- const wsRes = await fetch(`${BASE_URL}/workspaces`, {
89
- headers: { Authorization: `Bearer ${jwt}` },
90
- });
91
- if (!wsRes.ok) {
92
- const body = await wsRes.text();
93
- throw new Error(
94
- `Failed to fetch workspaces (HTTP ${wsRes.status}): ${body}`,
95
- );
96
- }
97
-
98
- // Response shape: { data: [{ workspaces: [{ actual_profile: { id, jwt, company_id, ... } }] }] }
99
- const wsBody = (await wsRes.json()) as {
100
- data: Array<{
101
- workspaces: Array<{
102
- actual_profile: {
103
- id: number;
104
- jwt: string;
105
- company_id: number;
106
- };
107
- }>;
108
- }>;
109
- };
110
-
111
- const account = wsBody.data?.[0];
112
- const workspace = account?.workspaces?.[0];
113
- const profile = workspace?.actual_profile;
114
-
115
- if (!profile?.jwt) {
116
- throw new Error("No workspace found for this account");
117
- }
118
-
119
- return {
120
- email,
121
- jwt,
122
- workspaceJwt: profile.jwt,
123
- profileId: profile.id,
124
- companyId: profile.company_id,
125
- cookies,
126
- createdAt: new Date().toISOString(),
127
- };
128
- }