mcp-pachca 0.1.0 → 0.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/dist/auth.d.ts +14 -0
- package/dist/auth.js +71 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +5 -3
- package/dist/client.js +31 -6
- package/dist/client.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/setup.js +30 -53
- package/dist/setup.js.map +1 -1
- package/dist/tools/handlers.js +84 -53
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/schemas.js +69 -64
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/types.d.ts +70 -54
- package/package.json +7 -2
- package/src/auth.ts +104 -0
- package/src/client.ts +42 -8
- package/src/index.ts +5 -4
- package/src/server.ts +3 -2
- package/src/setup.ts +42 -60
- package/src/tools/handlers.ts +110 -51
- package/src/tools/schemas.ts +70 -68
- package/src/tools/types.ts +73 -52
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Session {
|
|
2
|
+
email: string;
|
|
3
|
+
jwt: string;
|
|
4
|
+
workspaceJwt: string;
|
|
5
|
+
profileId: number;
|
|
6
|
+
companyId: number;
|
|
7
|
+
cookies: string[];
|
|
8
|
+
createdAt: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function getSessionPath(): string;
|
|
11
|
+
export declare function loadSession(): Session | null;
|
|
12
|
+
export declare function saveSession(session: Session): void;
|
|
13
|
+
export declare function requestOTP(email: string): Promise<void>;
|
|
14
|
+
export declare function performLogin(email: string, code: string): Promise<Session>;
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
const BASE_URL = "https://app.pachca.com/api/v3";
|
|
5
|
+
export function getSessionPath() {
|
|
6
|
+
return path.join(os.homedir(), ".config", "mcp-pachca", "session.json");
|
|
7
|
+
}
|
|
8
|
+
export function loadSession() {
|
|
9
|
+
const p = getSessionPath();
|
|
10
|
+
try {
|
|
11
|
+
const raw = fs.readFileSync(p, "utf8");
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function saveSession(session) {
|
|
19
|
+
const p = getSessionPath();
|
|
20
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
21
|
+
fs.writeFileSync(p, JSON.stringify(session, null, 2) + "\n", "utf8");
|
|
22
|
+
}
|
|
23
|
+
export async function requestOTP(email) {
|
|
24
|
+
const res = await fetch(`${BASE_URL}/account/code`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: { "Content-Type": "application/json" },
|
|
27
|
+
body: JSON.stringify({ email, reason: "login", retry: false }),
|
|
28
|
+
});
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
const body = await res.text();
|
|
31
|
+
throw new Error(`Failed to request OTP (HTTP ${res.status}): ${body}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function performLogin(email, code) {
|
|
35
|
+
// Step 1: Login with OTP code
|
|
36
|
+
const loginRes = await fetch(`${BASE_URL}/account/login`, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: { "Content-Type": "application/json" },
|
|
39
|
+
body: JSON.stringify({ email, code }),
|
|
40
|
+
});
|
|
41
|
+
if (!loginRes.ok) {
|
|
42
|
+
const body = await loginRes.text();
|
|
43
|
+
throw new Error(`Login failed (HTTP ${loginRes.status}): ${body}`);
|
|
44
|
+
}
|
|
45
|
+
const cookies = loginRes.headers.getSetCookie?.() ?? [];
|
|
46
|
+
const loginData = (await loginRes.json());
|
|
47
|
+
const { jwt } = loginData;
|
|
48
|
+
// Step 2: Get workspaces using account JWT
|
|
49
|
+
const wsRes = await fetch(`${BASE_URL}/workspaces`, {
|
|
50
|
+
headers: { Authorization: `Bearer ${jwt}` },
|
|
51
|
+
});
|
|
52
|
+
if (!wsRes.ok) {
|
|
53
|
+
const body = await wsRes.text();
|
|
54
|
+
throw new Error(`Failed to fetch workspaces (HTTP ${wsRes.status}): ${body}`);
|
|
55
|
+
}
|
|
56
|
+
const wsData = (await wsRes.json());
|
|
57
|
+
if (wsData.length === 0) {
|
|
58
|
+
throw new Error("No workspaces found for this account");
|
|
59
|
+
}
|
|
60
|
+
const ws = wsData[0];
|
|
61
|
+
return {
|
|
62
|
+
email,
|
|
63
|
+
jwt,
|
|
64
|
+
workspaceJwt: ws.jwt,
|
|
65
|
+
profileId: ws.profile_id,
|
|
66
|
+
companyId: ws.company_id,
|
|
67
|
+
cookies,
|
|
68
|
+
createdAt: new Date().toISOString(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { Session } from "./auth.js";
|
|
1
2
|
export declare class PachcaClient {
|
|
2
3
|
private readonly baseUrl;
|
|
3
|
-
private readonly
|
|
4
|
-
constructor(
|
|
4
|
+
private readonly session;
|
|
5
|
+
constructor(session: Session);
|
|
5
6
|
get<T>(path: string, params?: Record<string, string>): Promise<T>;
|
|
6
|
-
|
|
7
|
+
getWithArrayParams<T>(path: string, arrayParams: Record<string, (string | number)[]>, params?: Record<string, string>): Promise<T>;
|
|
8
|
+
post<T>(path: string, body: unknown): Promise<T | undefined>;
|
|
7
9
|
private request;
|
|
8
10
|
}
|
package/dist/client.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { logger } from "./logger.js";
|
|
2
2
|
export class PachcaClient {
|
|
3
|
-
baseUrl = "https://
|
|
4
|
-
|
|
5
|
-
constructor(
|
|
6
|
-
this.
|
|
3
|
+
baseUrl = "https://app.pachca.com/api/v3";
|
|
4
|
+
session;
|
|
5
|
+
constructor(session) {
|
|
6
|
+
this.session = session;
|
|
7
7
|
}
|
|
8
8
|
async get(path, params) {
|
|
9
9
|
const url = new URL(`${this.baseUrl}${path}`);
|
|
@@ -14,7 +14,23 @@ export class PachcaClient {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
return this.request("GET", url.toString());
|
|
17
|
+
return (await this.request("GET", url.toString()));
|
|
18
|
+
}
|
|
19
|
+
async getWithArrayParams(path, arrayParams, params) {
|
|
20
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
21
|
+
if (params) {
|
|
22
|
+
for (const [key, value] of Object.entries(params)) {
|
|
23
|
+
if (value !== undefined && value !== "") {
|
|
24
|
+
url.searchParams.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const [key, values] of Object.entries(arrayParams)) {
|
|
29
|
+
for (const v of values) {
|
|
30
|
+
url.searchParams.append(`${key}[]`, String(v));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return (await this.request("GET", url.toString()));
|
|
18
34
|
}
|
|
19
35
|
async post(path, body) {
|
|
20
36
|
return this.request("POST", `${this.baseUrl}${path}`, body);
|
|
@@ -25,9 +41,12 @@ export class PachcaClient {
|
|
|
25
41
|
const timeout = setTimeout(() => controller.abort(), 30_000);
|
|
26
42
|
try {
|
|
27
43
|
const headers = {
|
|
28
|
-
Authorization: `Bearer ${this.
|
|
44
|
+
Authorization: `Bearer ${this.session.workspaceJwt}`,
|
|
29
45
|
Accept: "application/json",
|
|
30
46
|
};
|
|
47
|
+
if (this.session.cookies.length > 0) {
|
|
48
|
+
headers["Cookie"] = this.session.cookies.join("; ");
|
|
49
|
+
}
|
|
31
50
|
if (body !== undefined) {
|
|
32
51
|
headers["Content-Type"] = "application/json; charset=utf-8";
|
|
33
52
|
}
|
|
@@ -37,6 +56,12 @@ export class PachcaClient {
|
|
|
37
56
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
38
57
|
signal: controller.signal,
|
|
39
58
|
});
|
|
59
|
+
if (response.status === 204) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
if (response.status === 401) {
|
|
63
|
+
throw new Error("Session expired. Run: npx mcp-pachca --setup");
|
|
64
|
+
}
|
|
40
65
|
if (!response.ok) {
|
|
41
66
|
let errorBody;
|
|
42
67
|
try {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { createServer } from "./server.js";
|
|
4
|
+
import { loadSession } from "./auth.js";
|
|
4
5
|
import { logger } from "./logger.js";
|
|
5
6
|
import { runSetup } from "./setup.js";
|
|
6
7
|
async function main() {
|
|
@@ -8,12 +9,12 @@ async function main() {
|
|
|
8
9
|
await runSetup();
|
|
9
10
|
process.exit(0);
|
|
10
11
|
}
|
|
11
|
-
const
|
|
12
|
-
if (!
|
|
13
|
-
logger.error("
|
|
12
|
+
const session = loadSession();
|
|
13
|
+
if (!session) {
|
|
14
|
+
logger.error("No session found. Run: npx mcp-pachca --setup");
|
|
14
15
|
process.exit(1);
|
|
15
16
|
}
|
|
16
|
-
const server = createServer(
|
|
17
|
+
const server = createServer(session);
|
|
17
18
|
const transport = new StdioServerTransport();
|
|
18
19
|
const shutdown = async (signal) => {
|
|
19
20
|
logger.info(`Received ${signal}, shutting down`);
|
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,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,
|
|
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,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,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,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,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"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.js
CHANGED
|
@@ -4,8 +4,8 @@ import { PachcaClient } from "./client.js";
|
|
|
4
4
|
import { toolDefinitions } from "./tools/schemas.js";
|
|
5
5
|
import { handlerRegistry } from "./tools/handlers.js";
|
|
6
6
|
import { logger } from "./logger.js";
|
|
7
|
-
export function createServer(
|
|
8
|
-
const client = new PachcaClient(
|
|
7
|
+
export function createServer(session) {
|
|
8
|
+
const client = new PachcaClient(session);
|
|
9
9
|
const server = new Server({ name: "mcp-pachca", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
10
10
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
11
11
|
tools: toolDefinitions,
|
package/dist/server.js.map
CHANGED
|
@@ -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;
|
|
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,CAAC;YAC7C,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/dist/setup.js
CHANGED
|
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import * as os from "node:os";
|
|
4
4
|
import * as rl from "node:readline/promises";
|
|
5
|
+
import { requestOTP, performLogin, saveSession } from "./auth.js";
|
|
5
6
|
const CLIENTS = ["Claude Code", "Cursor"];
|
|
6
7
|
const SCOPES = ["Project", "Global"];
|
|
7
8
|
function stderr(msg) {
|
|
@@ -49,46 +50,6 @@ function makeTTYPrompter() {
|
|
|
49
50
|
},
|
|
50
51
|
};
|
|
51
52
|
}
|
|
52
|
-
function askMaskedTTY(question) {
|
|
53
|
-
return new Promise((resolve) => {
|
|
54
|
-
stderr(question);
|
|
55
|
-
const buf = [];
|
|
56
|
-
process.stdin.setRawMode(true);
|
|
57
|
-
process.stdin.resume();
|
|
58
|
-
process.stdin.setEncoding("utf8");
|
|
59
|
-
const onData = (ch) => {
|
|
60
|
-
const c = ch.toString();
|
|
61
|
-
switch (c) {
|
|
62
|
-
case "\n":
|
|
63
|
-
case "\r":
|
|
64
|
-
case "\u0004": // Ctrl-D
|
|
65
|
-
process.stdin.setRawMode(false);
|
|
66
|
-
process.stdin.pause();
|
|
67
|
-
process.stdin.removeListener("data", onData);
|
|
68
|
-
stderrln();
|
|
69
|
-
resolve(buf.join(""));
|
|
70
|
-
break;
|
|
71
|
-
case "\u0003": // Ctrl-C
|
|
72
|
-
process.stdin.setRawMode(false);
|
|
73
|
-
process.stdin.pause();
|
|
74
|
-
process.stdin.removeListener("data", onData);
|
|
75
|
-
stderrln("\nAborted.");
|
|
76
|
-
process.exit(1);
|
|
77
|
-
break;
|
|
78
|
-
case "\u007F": // Backspace
|
|
79
|
-
if (buf.length > 0) {
|
|
80
|
-
buf.pop();
|
|
81
|
-
stderr("\b \b");
|
|
82
|
-
}
|
|
83
|
-
break;
|
|
84
|
-
default:
|
|
85
|
-
buf.push(c);
|
|
86
|
-
stderr("*");
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
process.stdin.on("data", onData);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
53
|
// --- Choice helper ---
|
|
93
54
|
async function askChoice(ask, question, choices) {
|
|
94
55
|
stderrln(question);
|
|
@@ -116,14 +77,11 @@ function resolveConfigPath(client, scope) {
|
|
|
116
77
|
? path.join(process.cwd(), ".cursor", "mcp.json")
|
|
117
78
|
: path.join(os.homedir(), ".cursor", "mcp.json");
|
|
118
79
|
}
|
|
119
|
-
function buildEntry(
|
|
80
|
+
function buildEntry() {
|
|
120
81
|
return {
|
|
121
82
|
type: "stdio",
|
|
122
83
|
command: "npx",
|
|
123
84
|
args: ["-y", "mcp-pachca@latest"],
|
|
124
|
-
env: {
|
|
125
|
-
PACHCA_ACCESS_TOKEN: token,
|
|
126
|
-
},
|
|
127
85
|
};
|
|
128
86
|
}
|
|
129
87
|
// --- Main ---
|
|
@@ -131,30 +89,50 @@ export async function runSetup() {
|
|
|
131
89
|
stderrln("mcp-pachca setup wizard\n");
|
|
132
90
|
let client;
|
|
133
91
|
let scope;
|
|
134
|
-
let
|
|
92
|
+
let email;
|
|
93
|
+
let code;
|
|
135
94
|
if (process.stdin.isTTY) {
|
|
136
95
|
const prompter = makeTTYPrompter();
|
|
137
96
|
client = await askChoice(prompter.ask, "Select your MCP client:", CLIENTS);
|
|
138
97
|
scope = await askChoice(prompter.ask, "Select config scope:", SCOPES);
|
|
98
|
+
email = await prompter.ask("Enter your Pachca email: ");
|
|
99
|
+
if (!email) {
|
|
100
|
+
stderrln("Error: email cannot be empty.");
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
stderrln("\nRequesting login code...");
|
|
104
|
+
await requestOTP(email);
|
|
105
|
+
stderrln("Check your email for the 6-digit code.");
|
|
106
|
+
code = await prompter.ask("Enter the code: ");
|
|
139
107
|
prompter.close();
|
|
140
|
-
token = await askMaskedTTY("Enter your PACHCA_ACCESS_TOKEN: ");
|
|
141
108
|
}
|
|
142
109
|
else {
|
|
143
110
|
const lines = await readAllLines();
|
|
144
111
|
const prompter = makePipePrompter(lines);
|
|
145
112
|
client = await askChoice(prompter.ask, "Select your MCP client:", CLIENTS);
|
|
146
113
|
scope = await askChoice(prompter.ask, "Select config scope:", SCOPES);
|
|
147
|
-
|
|
114
|
+
email = prompter.ask("Enter your Pachca email: ");
|
|
115
|
+
if (!email) {
|
|
116
|
+
stderrln("Error: email cannot be empty.");
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
stderrln("\nRequesting login code...");
|
|
120
|
+
await requestOTP(email);
|
|
121
|
+
stderrln("Check your email for the 6-digit code.");
|
|
122
|
+
code = prompter.ask("Enter the code: ");
|
|
148
123
|
}
|
|
149
|
-
if (!
|
|
150
|
-
stderrln("Error:
|
|
124
|
+
if (!code) {
|
|
125
|
+
stderrln("Error: code cannot be empty.");
|
|
151
126
|
process.exit(1);
|
|
152
127
|
}
|
|
128
|
+
stderrln("Logging in...");
|
|
129
|
+
const session = await performLogin(email, code);
|
|
130
|
+
saveSession(session);
|
|
131
|
+
stderrln(`Session saved to ~/.config/mcp-pachca/session.json`);
|
|
132
|
+
// Write MCP config
|
|
153
133
|
const configPath = resolveConfigPath(client, scope);
|
|
154
134
|
const dir = path.dirname(configPath);
|
|
155
|
-
// Ensure parent directories exist
|
|
156
135
|
fs.mkdirSync(dir, { recursive: true });
|
|
157
|
-
// Read existing config or start fresh
|
|
158
136
|
let config;
|
|
159
137
|
if (fs.existsSync(configPath)) {
|
|
160
138
|
const raw = fs.readFileSync(configPath, "utf8");
|
|
@@ -169,9 +147,8 @@ export async function runSetup() {
|
|
|
169
147
|
else {
|
|
170
148
|
config = {};
|
|
171
149
|
}
|
|
172
|
-
// Merge
|
|
173
150
|
const servers = (config["mcpServers"] ?? {});
|
|
174
|
-
servers["pachca"] = buildEntry(
|
|
151
|
+
servers["pachca"] = buildEntry();
|
|
175
152
|
config["mcpServers"] = servers;
|
|
176
153
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
177
154
|
stderrln(`\nConfig written to ${configPath}`);
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/handlers.js
CHANGED
|
@@ -1,49 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
async function handleSearchUsers(client, args) {
|
|
3
|
+
const params = {
|
|
4
|
+
type: "user",
|
|
5
|
+
query: String(args["query"]),
|
|
6
|
+
};
|
|
7
7
|
if (args["cursor"])
|
|
8
8
|
params["cursor"] = String(args["cursor"]);
|
|
9
|
-
return client.get("/
|
|
9
|
+
return client.get("/search", params);
|
|
10
10
|
}
|
|
11
11
|
async function handleGetUser(client, args) {
|
|
12
|
-
|
|
12
|
+
const data = await client.getWithArrayParams("/users", { ids: [Number(args["id"])] });
|
|
13
|
+
if (!data?.data?.length)
|
|
14
|
+
throw new Error(`User ${args["id"]} not found`);
|
|
15
|
+
return data.data[0];
|
|
13
16
|
}
|
|
14
17
|
async function handleListChats(client, args) {
|
|
18
|
+
const folders = await client.get("/menu/folders");
|
|
19
|
+
const folderKind = args["folder"];
|
|
20
|
+
if (!folderKind) {
|
|
21
|
+
return {
|
|
22
|
+
folders: folders?.map((f) => ({
|
|
23
|
+
id: f.id,
|
|
24
|
+
title: f.title,
|
|
25
|
+
kind: f.kind,
|
|
26
|
+
})),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const folder = folders?.find((f) => f.kind === folderKind);
|
|
30
|
+
if (!folder) {
|
|
31
|
+
return {
|
|
32
|
+
error: `Folder "${folderKind}" not found`,
|
|
33
|
+
available: folders?.map((f) => f.kind),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
15
36
|
const params = {};
|
|
16
|
-
if (args["availability"])
|
|
17
|
-
params["availability"] = String(args["availability"]);
|
|
18
|
-
if (args["limit"])
|
|
19
|
-
params["limit"] = String(args["limit"]);
|
|
20
37
|
if (args["cursor"])
|
|
21
38
|
params["cursor"] = String(args["cursor"]);
|
|
22
|
-
|
|
23
|
-
params["personal"] = String(args["personal"]);
|
|
24
|
-
if (args["sort"]) {
|
|
25
|
-
const sort = String(args["sort"]);
|
|
26
|
-
if (sort.startsWith("id_")) {
|
|
27
|
-
params["sort[id]"] = sort.replace("id_", "");
|
|
28
|
-
}
|
|
29
|
-
else if (sort.startsWith("last_message_at_")) {
|
|
30
|
-
params["sort[last_message_at]"] = sort.replace("last_message_at_", "");
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return client.get("/chats", params);
|
|
39
|
+
return client.get(`/menu/folders/${folder.id}/chats`, params);
|
|
34
40
|
}
|
|
35
41
|
async function handleGetChat(client, args) {
|
|
36
|
-
|
|
42
|
+
const data = await client.getWithArrayParams("/chats", { ids: [Number(args["id"])] });
|
|
43
|
+
if (!data?.records?.length)
|
|
44
|
+
throw new Error(`Chat ${args["id"]} not found`);
|
|
45
|
+
return data.records[0];
|
|
37
46
|
}
|
|
38
47
|
async function handleGetChatMembers(client, args) {
|
|
39
48
|
const params = {};
|
|
40
|
-
if (args["role"])
|
|
41
|
-
params["role"] = String(args["role"]);
|
|
42
49
|
if (args["limit"])
|
|
43
50
|
params["limit"] = String(args["limit"]);
|
|
44
51
|
if (args["cursor"])
|
|
45
52
|
params["cursor"] = String(args["cursor"]);
|
|
46
|
-
return client.get(`/chats/${args["id"]}/
|
|
53
|
+
return client.get(`/chats/${args["id"]}/users`, params);
|
|
47
54
|
}
|
|
48
55
|
async function handleListMessages(client, args) {
|
|
49
56
|
const params = {
|
|
@@ -51,45 +58,69 @@ async function handleListMessages(client, args) {
|
|
|
51
58
|
};
|
|
52
59
|
if (args["per"])
|
|
53
60
|
params["per"] = String(args["per"]);
|
|
54
|
-
if (args["
|
|
55
|
-
params["
|
|
61
|
+
if (args["message_id"])
|
|
62
|
+
params["message_id"] = String(args["message_id"]);
|
|
63
|
+
if (args["direction"])
|
|
64
|
+
params["direction"] = String(args["direction"]);
|
|
56
65
|
return client.get("/messages", params);
|
|
57
66
|
}
|
|
58
67
|
async function handleGetMessage(client, args) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (args["page"])
|
|
66
|
-
params["page"] = String(args["page"]);
|
|
67
|
-
return client.get("/group_tags", params);
|
|
68
|
-
}
|
|
69
|
-
async function handleGetThread(client, args) {
|
|
70
|
-
return client.get(`/threads/${args["id"]}`);
|
|
68
|
+
const data = await client.getWithArrayParams("/messages", {
|
|
69
|
+
ids: [Number(args["id"])],
|
|
70
|
+
});
|
|
71
|
+
if (!data?.length)
|
|
72
|
+
throw new Error(`Message ${args["id"]} not found`);
|
|
73
|
+
return data[0];
|
|
71
74
|
}
|
|
72
75
|
async function handleSendMessage(client, args) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
const body = {
|
|
77
|
+
chat_id: Number(args["chat_id"]),
|
|
78
|
+
text: String(args["text"]),
|
|
79
|
+
uuid: randomUUID(),
|
|
80
|
+
};
|
|
81
|
+
if (args["parent_message_id"]) {
|
|
82
|
+
body["parent_message_id"] = Number(args["parent_message_id"]);
|
|
83
|
+
}
|
|
84
|
+
const result = await client.post("/messages", body);
|
|
85
|
+
return result ?? { success: true };
|
|
86
|
+
}
|
|
87
|
+
async function handleSearch(client, args) {
|
|
88
|
+
const params = {
|
|
89
|
+
type: "message",
|
|
90
|
+
query: String(args["query"]),
|
|
76
91
|
};
|
|
77
|
-
if (args["
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
92
|
+
if (args["cursor"])
|
|
93
|
+
params["cursor"] = String(args["cursor"]);
|
|
94
|
+
return client.get("/search", params);
|
|
95
|
+
}
|
|
96
|
+
async function handleGetProfile(client) {
|
|
97
|
+
return client.get("/profile");
|
|
98
|
+
}
|
|
99
|
+
async function handleGetUnread(client) {
|
|
100
|
+
return client.get("/chats/unread_ids");
|
|
101
|
+
}
|
|
102
|
+
async function handleGetPresence(client, args) {
|
|
103
|
+
const ids = args["ids"];
|
|
104
|
+
return client.getWithArrayParams("/friends/presence", {
|
|
105
|
+
ids,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function handleGetPersonalChat(client, args) {
|
|
109
|
+
return client.getWithArrayParams("/users/personal_chats", { ids: [Number(args["id"])] });
|
|
82
110
|
}
|
|
83
111
|
export const handlerRegistry = {
|
|
84
|
-
|
|
112
|
+
pachca_search_users: handleSearchUsers,
|
|
85
113
|
pachca_get_user: handleGetUser,
|
|
86
114
|
pachca_list_chats: handleListChats,
|
|
87
115
|
pachca_get_chat: handleGetChat,
|
|
88
116
|
pachca_get_chat_members: handleGetChatMembers,
|
|
89
117
|
pachca_list_messages: handleListMessages,
|
|
90
118
|
pachca_get_message: handleGetMessage,
|
|
91
|
-
pachca_list_tags: handleListTags,
|
|
92
|
-
pachca_get_thread: handleGetThread,
|
|
93
119
|
pachca_send_message: handleSendMessage,
|
|
120
|
+
pachca_search: handleSearch,
|
|
121
|
+
pachca_get_profile: handleGetProfile,
|
|
122
|
+
pachca_get_unread: handleGetUnread,
|
|
123
|
+
pachca_get_presence: handleGetPresence,
|
|
124
|
+
pachca_get_personal_chat: handleGetPersonalChat,
|
|
94
125
|
};
|
|
95
126
|
//# sourceMappingURL=handlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
|