@tickernelz/paperclip-pro-adapter-utils 2026.925.0 → 2026.925.2
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/acpx-engine/execute.d.ts.map +1 -1
- package/dist/acpx-engine/execute.js +32 -18
- package/dist/acpx-engine/execute.js.map +1 -1
- package/dist/acpx-engine/execute.test.js +3 -4
- package/dist/acpx-engine/execute.test.js.map +1 -1
- package/dist/paperclip-mcp-mount.d.ts +36 -0
- package/dist/paperclip-mcp-mount.d.ts.map +1 -0
- package/dist/paperclip-mcp-mount.js +101 -0
- package/dist/paperclip-mcp-mount.js.map +1 -0
- package/dist/paperclip-mcp.d.ts +53 -0
- package/dist/paperclip-mcp.d.ts.map +1 -0
- package/dist/paperclip-mcp.js +145 -0
- package/dist/paperclip-mcp.js.map +1 -0
- package/dist/paperclip-mcp.test.d.ts +2 -0
- package/dist/paperclip-mcp.test.d.ts.map +1 -0
- package/dist/paperclip-mcp.test.js +119 -0
- package/dist/paperclip-mcp.test.js.map +1 -0
- package/dist/server-utils.d.ts +4 -0
- package/dist/server-utils.d.ts.map +1 -1
- package/dist/server-utils.js +36 -25
- package/dist/server-utils.js.map +1 -1
- package/dist/server-utils.test.js +2 -2
- package/dist/server-utils.test.js.map +1 -1
- package/node_modules/bare-fs/binding.c +53 -24
- package/node_modules/bare-fs/index.d.ts +12 -10
- package/node_modules/bare-fs/index.js +13 -4
- package/node_modules/bare-fs/package.json +2 -1
- package/node_modules/bare-fs/prebuilds/android-arm/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-ia32/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/darwin-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/darwin-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-arm64-simulator/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-x64-simulator/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/linux-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/linux-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/win32-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/win32-x64/bare-fs.bare +0 -0
- package/package.json +2 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AdapterExecutionTarget } from "./execution-target.js";
|
|
2
|
+
export interface PaperclipMcpMount {
|
|
3
|
+
dir: string;
|
|
4
|
+
filePath: string;
|
|
5
|
+
cleanup: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface PaperclipMcpHttpTarget {
|
|
8
|
+
url: string;
|
|
9
|
+
headers: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
/** Resolve the run's server-hosted MCP endpoint and the headers that authenticate it. */
|
|
12
|
+
export declare function paperclipMcpHttpTarget(input: {
|
|
13
|
+
env: Record<string, string | undefined>;
|
|
14
|
+
toolsets: string;
|
|
15
|
+
}): PaperclipMcpHttpTarget;
|
|
16
|
+
/** Gemini CLI settings.json: streamable HTTP servers use `httpUrl`. */
|
|
17
|
+
export declare function renderPaperclipGeminiSettings(target: PaperclipMcpHttpTarget): string;
|
|
18
|
+
/** OpenCode config: remote servers live under `mcp` with `type: "remote"`. */
|
|
19
|
+
export declare function renderPaperclipOpenCodeConfig(target: PaperclipMcpHttpTarget): string;
|
|
20
|
+
/** Grok CLI config overlay: `[mcp_servers.<name>]` with an inline headers table. */
|
|
21
|
+
export declare function renderPaperclipGrokConfig(target: PaperclipMcpHttpTarget): string;
|
|
22
|
+
/** Write a run-scoped config file locally or on the execution target, with a cleanup that removes it. */
|
|
23
|
+
export declare function writePaperclipMcpMount(input: {
|
|
24
|
+
runId: string;
|
|
25
|
+
target: AdapterExecutionTarget | null | undefined;
|
|
26
|
+
remote: boolean;
|
|
27
|
+
content: string;
|
|
28
|
+
fileName: string;
|
|
29
|
+
localPrefix: string;
|
|
30
|
+
remoteDir: string | null;
|
|
31
|
+
cwd: string;
|
|
32
|
+
env: Record<string, string>;
|
|
33
|
+
timeoutSec: number;
|
|
34
|
+
graceSec: number;
|
|
35
|
+
}): Promise<PaperclipMcpMount>;
|
|
36
|
+
//# sourceMappingURL=paperclip-mcp-mount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp-mount.d.ts","sourceRoot":"","sources":["../src/paperclip-mcp-mount.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAC;AAO/B,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,sBAAsB,CAQzB;AAED,uEAAuE;AACvE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAOpF;AAED,8EAA8E;AAC9E,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAcpF;AAMD,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAWhF;AAMD,yGAAyG;AACzG,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6C7B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { runAdapterExecutionTargetShellCommand, } from "./execution-target.js";
|
|
5
|
+
import { PAPERCLIP_MCP_SERVER_NAME, paperclipMcpEndpoint, paperclipMcpHttpHeaders, } from "./paperclip-mcp.js";
|
|
6
|
+
/** Resolve the run's server-hosted MCP endpoint and the headers that authenticate it. */
|
|
7
|
+
export function paperclipMcpHttpTarget(input) {
|
|
8
|
+
return {
|
|
9
|
+
url: paperclipMcpEndpoint(input.env.PAPERCLIP_API_URL ?? "", input.toolsets),
|
|
10
|
+
headers: paperclipMcpHttpHeaders({
|
|
11
|
+
apiKey: (input.env.PAPERCLIP_API_KEY ?? "").trim(),
|
|
12
|
+
runId: input.env.PAPERCLIP_RUN_ID ?? "",
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Gemini CLI settings.json: streamable HTTP servers use `httpUrl`. */
|
|
17
|
+
export function renderPaperclipGeminiSettings(target) {
|
|
18
|
+
const settings = {
|
|
19
|
+
mcpServers: {
|
|
20
|
+
[PAPERCLIP_MCP_SERVER_NAME]: { httpUrl: target.url, headers: target.headers },
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
return `${JSON.stringify(settings, null, 2)}\n`;
|
|
24
|
+
}
|
|
25
|
+
/** OpenCode config: remote servers live under `mcp` with `type: "remote"`. */
|
|
26
|
+
export function renderPaperclipOpenCodeConfig(target) {
|
|
27
|
+
const config = {
|
|
28
|
+
$schema: "https://opencode.ai/config.json",
|
|
29
|
+
mcp: {
|
|
30
|
+
[PAPERCLIP_MCP_SERVER_NAME]: {
|
|
31
|
+
type: "remote",
|
|
32
|
+
url: target.url,
|
|
33
|
+
enabled: true,
|
|
34
|
+
oauth: false,
|
|
35
|
+
headers: target.headers,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return `${JSON.stringify(config, null, 2)}\n`;
|
|
40
|
+
}
|
|
41
|
+
function tomlString(value) {
|
|
42
|
+
return JSON.stringify(value);
|
|
43
|
+
}
|
|
44
|
+
/** Grok CLI config overlay: `[mcp_servers.<name>]` with an inline headers table. */
|
|
45
|
+
export function renderPaperclipGrokConfig(target) {
|
|
46
|
+
const headers = Object.entries(target.headers)
|
|
47
|
+
.map(([key, value]) => `${tomlString(key)} = ${tomlString(value)}`)
|
|
48
|
+
.join(", ");
|
|
49
|
+
return [
|
|
50
|
+
`[mcp_servers.${tomlString(PAPERCLIP_MCP_SERVER_NAME)}]`,
|
|
51
|
+
`url = ${tomlString(target.url)}`,
|
|
52
|
+
"enabled = true",
|
|
53
|
+
`headers = { ${headers} }`,
|
|
54
|
+
"",
|
|
55
|
+
].join("\n");
|
|
56
|
+
}
|
|
57
|
+
function shellQuoteSingle(value) {
|
|
58
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
59
|
+
}
|
|
60
|
+
/** Write a run-scoped config file locally or on the execution target, with a cleanup that removes it. */
|
|
61
|
+
export async function writePaperclipMcpMount(input) {
|
|
62
|
+
if (!input.remote) {
|
|
63
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), input.localPrefix));
|
|
64
|
+
await fs.chmod(dir, 0o700);
|
|
65
|
+
const filePath = path.join(dir, input.fileName);
|
|
66
|
+
await fs.writeFile(filePath, input.content, { encoding: "utf8", mode: 0o600 });
|
|
67
|
+
return {
|
|
68
|
+
dir,
|
|
69
|
+
filePath,
|
|
70
|
+
cleanup: async () => {
|
|
71
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const dir = input.remoteDir ?? path.posix.join(input.cwd, ".paperclip-runtime", "mcp");
|
|
76
|
+
const filePath = path.posix.join(dir, input.fileName);
|
|
77
|
+
const quotedDir = shellQuoteSingle(dir);
|
|
78
|
+
const quotedFile = shellQuoteSingle(filePath);
|
|
79
|
+
const shellOptions = {
|
|
80
|
+
cwd: input.cwd,
|
|
81
|
+
env: input.env,
|
|
82
|
+
timeoutSec: Math.min(input.timeoutSec || 15, 15),
|
|
83
|
+
graceSec: Math.min(input.graceSec, 5),
|
|
84
|
+
};
|
|
85
|
+
const heredoc = [
|
|
86
|
+
`mkdir -p ${quotedDir}`,
|
|
87
|
+
`cat > ${quotedFile} <<'PAPERCLIP_MCP_MOUNT'`,
|
|
88
|
+
input.content.replace(/\n$/, ""),
|
|
89
|
+
"PAPERCLIP_MCP_MOUNT",
|
|
90
|
+
`chmod 600 ${quotedFile}`,
|
|
91
|
+
].join("\n");
|
|
92
|
+
await runAdapterExecutionTargetShellCommand(input.runId, input.target, heredoc, shellOptions);
|
|
93
|
+
return {
|
|
94
|
+
dir,
|
|
95
|
+
filePath,
|
|
96
|
+
cleanup: async () => {
|
|
97
|
+
await runAdapterExecutionTargetShellCommand(input.runId, input.target, `rm -rf ${quotedDir}`, shellOptions).catch(() => { });
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=paperclip-mcp-mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp-mount.js","sourceRoot":"","sources":["../src/paperclip-mcp-mount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare const PAPERCLIP_MCP_SERVER_NAME = "paperclip";
|
|
2
|
+
export declare const PAPERCLIP_MCP_PACKAGE = "@tickernelz/paperclip-pro-mcp-server";
|
|
3
|
+
export declare const PAPERCLIP_MCP_BIN = "paperclip-mcp-server";
|
|
4
|
+
export declare const PAPERCLIP_MCP_DEFAULT_TOOLSETS = "core";
|
|
5
|
+
export declare const PAPERCLIP_MCP_TOOLSETS_ENV = "PAPERCLIP_MCP_TOOLSETS";
|
|
6
|
+
export declare const PAPERCLIP_MCP_HTTP_PATH = "/mcp/paperclip";
|
|
7
|
+
export declare const PAPERCLIP_MCP_RUN_ID_HEADER = "X-Paperclip-Run-Id";
|
|
8
|
+
/** Which Paperclip access surface an adapter arms for a run. */
|
|
9
|
+
export type PaperclipAccessMode = "mcp" | "rest";
|
|
10
|
+
export type PaperclipMcpTransportKind = "http" | "stdio";
|
|
11
|
+
export interface PaperclipMcpCommand {
|
|
12
|
+
command: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
source: "bin" | "dist" | "path";
|
|
15
|
+
}
|
|
16
|
+
export declare function paperclipMcpToolsets(config: Record<string, unknown>): string;
|
|
17
|
+
export declare function paperclipMcpTransport(config: Record<string, unknown>): PaperclipMcpTransportKind;
|
|
18
|
+
/** Server-hosted MCP endpoint for this run, mirroring the API base the REST path uses. */
|
|
19
|
+
export declare function paperclipMcpEndpoint(apiUrl: string, toolsets: string): string;
|
|
20
|
+
/** MCP needs the `paperclipMcp` toggle on plus an API base and a run credential; everything else is REST. */
|
|
21
|
+
export declare function paperclipAccessMode(config: Record<string, unknown>, env: Record<string, string | undefined>): PaperclipAccessMode;
|
|
22
|
+
export declare function paperclipMcpHttpHeaders(input: {
|
|
23
|
+
apiKey: string;
|
|
24
|
+
runId?: string;
|
|
25
|
+
}): Record<string, string>;
|
|
26
|
+
/** Locate the stdio MCP server shipped with this install: nearest `.bin` shim, then `dist/stdio.js`, then PATH. */
|
|
27
|
+
export declare function resolvePaperclipMcpServerCommand(options?: {
|
|
28
|
+
searchFrom?: string;
|
|
29
|
+
exists?: (candidate: string) => boolean;
|
|
30
|
+
nodePath?: string;
|
|
31
|
+
}): PaperclipMcpCommand;
|
|
32
|
+
export interface PaperclipMcpServerEntryInput {
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
transport: PaperclipMcpTransportKind;
|
|
35
|
+
command: PaperclipMcpCommand;
|
|
36
|
+
toolsets: string;
|
|
37
|
+
env: Record<string, string>;
|
|
38
|
+
/** `placeholder` emits `${PAPERCLIP_API_KEY}` for runtimes that expand env references; `literal` writes the token. */
|
|
39
|
+
credential?: "placeholder" | "literal";
|
|
40
|
+
}
|
|
41
|
+
export declare function buildPaperclipMcpServerEntry(input: PaperclipMcpServerEntryInput): Record<string, unknown>;
|
|
42
|
+
export declare function renderPaperclipMcpConfig(input: PaperclipMcpServerEntryInput): string;
|
|
43
|
+
export declare function paperclipMcpGuidance(toolsets: string, toolCount?: number | null): string;
|
|
44
|
+
/** Guidance for runtimes without the Paperclip MCP: reach the board over REST with the run credentials in env. */
|
|
45
|
+
export declare function paperclipRestGuidance(options?: {
|
|
46
|
+
shellHint?: string;
|
|
47
|
+
}): string;
|
|
48
|
+
export declare function paperclipAccessGuidance(access: PaperclipAccessMode, options?: {
|
|
49
|
+
toolsets?: string;
|
|
50
|
+
toolCount?: number | null;
|
|
51
|
+
shellHint?: string;
|
|
52
|
+
}): string;
|
|
53
|
+
//# sourceMappingURL=paperclip-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.d.ts","sourceRoot":"","sources":["../src/paperclip-mcp.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,cAAc,CAAC;AACrD,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAC5E,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AACxD,eAAO,MAAM,8BAA8B,SAAS,CAAC;AACrD,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAUhE,gEAAgE;AAChE,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CACjC;AAYD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAM5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAEhG;AAED,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI7E;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,mBAAmB,CAKrB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzB;AAED,mHAAmH;AACnH,wBAAgB,gCAAgC,CAAC,OAAO,GAAE;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,mBAAmB,CAc3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,yBAAyB,CAAC;IACrC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,sHAAsH;IACtH,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,4BAA4B,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4BzB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,GAAG,MAAM,CAGpF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAO9F;AAED,kHAAkH;AAClH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAelF;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACjF,MAAM,CAIR"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const PAPERCLIP_MCP_SERVER_NAME = "paperclip";
|
|
4
|
+
export const PAPERCLIP_MCP_PACKAGE = "@tickernelz/paperclip-pro-mcp-server";
|
|
5
|
+
export const PAPERCLIP_MCP_BIN = "paperclip-mcp-server";
|
|
6
|
+
export const PAPERCLIP_MCP_DEFAULT_TOOLSETS = "core";
|
|
7
|
+
export const PAPERCLIP_MCP_TOOLSETS_ENV = "PAPERCLIP_MCP_TOOLSETS";
|
|
8
|
+
export const PAPERCLIP_MCP_HTTP_PATH = "/mcp/paperclip";
|
|
9
|
+
export const PAPERCLIP_MCP_RUN_ID_HEADER = "X-Paperclip-Run-Id";
|
|
10
|
+
const RUN_ENV_KEYS = [
|
|
11
|
+
"PAPERCLIP_API_URL",
|
|
12
|
+
"PAPERCLIP_API_KEY",
|
|
13
|
+
"PAPERCLIP_COMPANY_ID",
|
|
14
|
+
"PAPERCLIP_AGENT_ID",
|
|
15
|
+
"PAPERCLIP_RUN_ID",
|
|
16
|
+
];
|
|
17
|
+
function readToggle(value, fallback) {
|
|
18
|
+
if (typeof value === "boolean")
|
|
19
|
+
return value;
|
|
20
|
+
if (typeof value === "string") {
|
|
21
|
+
const normalized = value.trim().toLowerCase();
|
|
22
|
+
if (["true", "1", "yes", "on"].includes(normalized))
|
|
23
|
+
return true;
|
|
24
|
+
if (["false", "0", "no", "off"].includes(normalized))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return fallback;
|
|
28
|
+
}
|
|
29
|
+
export function paperclipMcpToolsets(config) {
|
|
30
|
+
const parts = (typeof config.paperclipMcpToolsets === "string" ? config.paperclipMcpToolsets : "")
|
|
31
|
+
.split(",")
|
|
32
|
+
.map((part) => part.trim())
|
|
33
|
+
.filter(Boolean);
|
|
34
|
+
return parts.length > 0 ? parts.join(",") : PAPERCLIP_MCP_DEFAULT_TOOLSETS;
|
|
35
|
+
}
|
|
36
|
+
export function paperclipMcpTransport(config) {
|
|
37
|
+
return config.paperclipMcpTransport === "stdio" ? "stdio" : "http";
|
|
38
|
+
}
|
|
39
|
+
/** Server-hosted MCP endpoint for this run, mirroring the API base the REST path uses. */
|
|
40
|
+
export function paperclipMcpEndpoint(apiUrl, toolsets) {
|
|
41
|
+
const trimmed = apiUrl.trim().replace(/\/+$/, "");
|
|
42
|
+
const base = trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
|
|
43
|
+
return `${base}${PAPERCLIP_MCP_HTTP_PATH}?toolsets=${encodeURIComponent(toolsets)}`;
|
|
44
|
+
}
|
|
45
|
+
/** MCP needs the `paperclipMcp` toggle on plus an API base and a run credential; everything else is REST. */
|
|
46
|
+
export function paperclipAccessMode(config, env) {
|
|
47
|
+
if (!readToggle(config.paperclipMcp, true))
|
|
48
|
+
return "rest";
|
|
49
|
+
if (!(env.PAPERCLIP_API_URL ?? "").trim())
|
|
50
|
+
return "rest";
|
|
51
|
+
if (!(env.PAPERCLIP_API_KEY ?? "").trim())
|
|
52
|
+
return "rest";
|
|
53
|
+
return "mcp";
|
|
54
|
+
}
|
|
55
|
+
export function paperclipMcpHttpHeaders(input) {
|
|
56
|
+
const headers = { Authorization: `Bearer ${input.apiKey}` };
|
|
57
|
+
const runId = (input.runId ?? "").trim();
|
|
58
|
+
if (runId)
|
|
59
|
+
headers[PAPERCLIP_MCP_RUN_ID_HEADER] = runId;
|
|
60
|
+
return headers;
|
|
61
|
+
}
|
|
62
|
+
/** Locate the stdio MCP server shipped with this install: nearest `.bin` shim, then `dist/stdio.js`, then PATH. */
|
|
63
|
+
export function resolvePaperclipMcpServerCommand(options = {}) {
|
|
64
|
+
const exists = options.exists ?? existsSync;
|
|
65
|
+
const nodePath = options.nodePath ?? process.execPath;
|
|
66
|
+
let dir = path.resolve(options.searchFrom ?? import.meta.dirname);
|
|
67
|
+
for (;;) {
|
|
68
|
+
const modules = path.join(dir, "node_modules");
|
|
69
|
+
const bin = path.join(modules, ".bin", PAPERCLIP_MCP_BIN);
|
|
70
|
+
if (exists(bin))
|
|
71
|
+
return { command: bin, args: [], source: "bin" };
|
|
72
|
+
const dist = path.join(modules, PAPERCLIP_MCP_PACKAGE, "dist", "stdio.js");
|
|
73
|
+
if (exists(dist))
|
|
74
|
+
return { command: nodePath, args: [dist], source: "dist" };
|
|
75
|
+
const parent = path.dirname(dir);
|
|
76
|
+
if (parent === dir)
|
|
77
|
+
return { command: PAPERCLIP_MCP_BIN, args: [], source: "path" };
|
|
78
|
+
dir = parent;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function buildPaperclipMcpServerEntry(input) {
|
|
82
|
+
const literal = input.credential === "literal";
|
|
83
|
+
const apiKey = (input.env.PAPERCLIP_API_KEY ?? "").trim();
|
|
84
|
+
if (input.transport === "http") {
|
|
85
|
+
return {
|
|
86
|
+
type: "http",
|
|
87
|
+
enabled: input.enabled,
|
|
88
|
+
url: paperclipMcpEndpoint(input.env.PAPERCLIP_API_URL ?? "", input.toolsets),
|
|
89
|
+
headers: paperclipMcpHttpHeaders({
|
|
90
|
+
apiKey: literal ? apiKey : "${PAPERCLIP_API_KEY}",
|
|
91
|
+
runId: input.env.PAPERCLIP_RUN_ID ?? "",
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const env = {};
|
|
96
|
+
for (const key of RUN_ENV_KEYS) {
|
|
97
|
+
const value = input.env[key];
|
|
98
|
+
if (typeof value !== "string" || !value.trim())
|
|
99
|
+
continue;
|
|
100
|
+
env[key] = key === "PAPERCLIP_API_KEY" && !literal ? `\${${key}}` : value.trim();
|
|
101
|
+
}
|
|
102
|
+
env[PAPERCLIP_MCP_TOOLSETS_ENV] = input.toolsets;
|
|
103
|
+
return {
|
|
104
|
+
type: "stdio",
|
|
105
|
+
enabled: input.enabled,
|
|
106
|
+
command: input.command.command,
|
|
107
|
+
args: [...input.command.args, "--toolsets", input.toolsets],
|
|
108
|
+
env,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function renderPaperclipMcpConfig(input) {
|
|
112
|
+
const servers = { [PAPERCLIP_MCP_SERVER_NAME]: buildPaperclipMcpServerEntry(input) };
|
|
113
|
+
return `${JSON.stringify({ mcpServers: servers }, null, 2)}\n`;
|
|
114
|
+
}
|
|
115
|
+
export function paperclipMcpGuidance(toolsets, toolCount = null) {
|
|
116
|
+
return [
|
|
117
|
+
`Paperclip's API is mounted as MCP tools on the "${PAPERCLIP_MCP_SERVER_NAME}" server (toolsets: ${toolsets}${toolCount === null ? "" : `, ${toolCount} tools`}).`,
|
|
118
|
+
'Every tool name starts with "paperclip", for example paperclipListIssues or paperclipAddComment.',
|
|
119
|
+
"These tools are the only way to reach Paperclip; they already carry this run's identity, API key and run id.",
|
|
120
|
+
`When no dedicated tool covers an endpoint, use the ${PAPERCLIP_MCP_SERVER_NAME} escape-hatch tool paperclipApiRequest instead of a shell HTTP client.`,
|
|
121
|
+
].join("\n");
|
|
122
|
+
}
|
|
123
|
+
/** Guidance for runtimes without the Paperclip MCP: reach the board over REST with the run credentials in env. */
|
|
124
|
+
export function paperclipRestGuidance(options = {}) {
|
|
125
|
+
const shell = options.shellHint?.trim();
|
|
126
|
+
return [
|
|
127
|
+
"This runtime has no paperclip* tools. Reach Paperclip over its REST API instead.",
|
|
128
|
+
shell
|
|
129
|
+
? `Use ${shell} with curl; normalize the base URL first: PAPERCLIP_API_BASE="\${PAPERCLIP_API_URL%/}"; PAPERCLIP_API_BASE="\${PAPERCLIP_API_BASE%/api}".`
|
|
130
|
+
: 'Use a terminal with curl; normalize the base URL first: PAPERCLIP_API_BASE="${PAPERCLIP_API_URL%/}"; PAPERCLIP_API_BASE="${PAPERCLIP_API_BASE%/api}".',
|
|
131
|
+
'Send `Authorization: Bearer $PAPERCLIP_API_KEY` on every request and `X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID` on every mutation.',
|
|
132
|
+
"GET example:",
|
|
133
|
+
' curl -s -H "Authorization: Bearer $PAPERCLIP_API_KEY" "$PAPERCLIP_API_BASE/api/agents/me"',
|
|
134
|
+
"Write example:",
|
|
135
|
+
' curl -s -X POST -H "Authorization: Bearer $PAPERCLIP_API_KEY" -H "Content-Type: application/json" -H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" -d \'{"body":"Status update from agent."}\' "$PAPERCLIP_API_BASE/api/issues/$PAPERCLIP_TASK_ID/comments"',
|
|
136
|
+
"Never send a placeholder like {id} in a URL; substitute a real issue id from the current context.",
|
|
137
|
+
"Do not copy printed tokens into comments or config; reference the environment variables.",
|
|
138
|
+
].join("\n");
|
|
139
|
+
}
|
|
140
|
+
export function paperclipAccessGuidance(access, options = {}) {
|
|
141
|
+
return access === "mcp"
|
|
142
|
+
? paperclipMcpGuidance(options.toolsets ?? PAPERCLIP_MCP_DEFAULT_TOOLSETS, options.toolCount ?? null)
|
|
143
|
+
: paperclipRestGuidance({ shellHint: options.shellHint });
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=paperclip-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.js","sourceRoot":"","sources":["../src/paperclip-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.test.d.ts","sourceRoot":"","sources":["../src/paperclip-mcp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { paperclipAccessGuidance, paperclipAccessMode, paperclipMcpEndpoint, paperclipMcpHttpHeaders, paperclipMcpToolsets, renderPaperclipMcpConfig, } from "./paperclip-mcp.js";
|
|
3
|
+
import { paperclipMcpHttpTarget, renderPaperclipGeminiSettings, renderPaperclipGrokConfig, renderPaperclipOpenCodeConfig, } from "./paperclip-mcp-mount.js";
|
|
4
|
+
import { paperclipAgentPromptTemplate, renderPaperclipWakePrompt, } from "./server-utils.js";
|
|
5
|
+
const TOOL_NAME_RE = /\bpaperclip[A-Z]\w*/;
|
|
6
|
+
const runEnv = {
|
|
7
|
+
PAPERCLIP_API_URL: "https://paperclip.test",
|
|
8
|
+
PAPERCLIP_API_KEY: "run-key",
|
|
9
|
+
PAPERCLIP_RUN_ID: "run-7",
|
|
10
|
+
};
|
|
11
|
+
describe("paperclipAccessMode", () => {
|
|
12
|
+
it("arms MCP only when the toggle is on and the run carries a reachable credential", () => {
|
|
13
|
+
expect(paperclipAccessMode({}, runEnv)).toBe("mcp");
|
|
14
|
+
expect(paperclipAccessMode({ paperclipMcp: false }, runEnv)).toBe("rest");
|
|
15
|
+
expect(paperclipAccessMode({ paperclipMcp: "false" }, runEnv)).toBe("rest");
|
|
16
|
+
expect(paperclipAccessMode({}, { ...runEnv, PAPERCLIP_API_KEY: " " })).toBe("rest");
|
|
17
|
+
expect(paperclipAccessMode({}, { ...runEnv, PAPERCLIP_API_URL: undefined })).toBe("rest");
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("paperclipAgentPromptTemplate", () => {
|
|
21
|
+
it("names the MCP tools only on the mcp surface and the REST routes otherwise", () => {
|
|
22
|
+
const mcp = paperclipAgentPromptTemplate("mcp");
|
|
23
|
+
expect(mcp).toContain("paperclipAddComment");
|
|
24
|
+
expect(mcp).toContain("paperclipSuggestTasks");
|
|
25
|
+
const rest = paperclipAgentPromptTemplate("rest");
|
|
26
|
+
expect(rest).not.toMatch(TOOL_NAME_RE);
|
|
27
|
+
expect(rest).toContain("POST /api/issues/$PAPERCLIP_TASK_ID/interactions");
|
|
28
|
+
expect(rest).toContain("PATCH /api/issues/$PAPERCLIP_TASK_ID");
|
|
29
|
+
});
|
|
30
|
+
it("keeps the execution contract identical apart from the access-surface lines", () => {
|
|
31
|
+
const mcpLines = paperclipAgentPromptTemplate("mcp").split("\n");
|
|
32
|
+
const restLines = paperclipAgentPromptTemplate("rest").split("\n");
|
|
33
|
+
expect(restLines).toHaveLength(mcpLines.length);
|
|
34
|
+
const differing = mcpLines.filter((line, index) => line !== restLines[index]);
|
|
35
|
+
expect(differing).toHaveLength(2);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe("renderPaperclipWakePrompt", () => {
|
|
39
|
+
const wake = {
|
|
40
|
+
reason: "issue_assigned",
|
|
41
|
+
issue: { id: "issue-1", identifier: "PC-1", title: "Ship it", status: "todo" },
|
|
42
|
+
checkedOutByHarness: true,
|
|
43
|
+
};
|
|
44
|
+
it("points the already-checked-out note at the surface the run actually has", () => {
|
|
45
|
+
expect(renderPaperclipWakePrompt(wake)).toContain("`paperclipCheckoutIssue`");
|
|
46
|
+
const rest = renderPaperclipWakePrompt(wake, { paperclipAccess: "rest" });
|
|
47
|
+
expect(rest).not.toMatch(TOOL_NAME_RE);
|
|
48
|
+
expect(rest).toContain("POST /api/issues/$PAPERCLIP_TASK_ID/checkout");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("paperclipAccessGuidance", () => {
|
|
52
|
+
it("teaches tools on mcp and curl with the run headers on rest", () => {
|
|
53
|
+
const mcp = paperclipAccessGuidance("mcp", { toolsets: "core,extended" });
|
|
54
|
+
expect(mcp).toContain("toolsets: core,extended");
|
|
55
|
+
expect(mcp).toContain("paperclipListIssues");
|
|
56
|
+
const rest = paperclipAccessGuidance("rest", { shellHint: "run_shell_command" });
|
|
57
|
+
expect(rest).not.toMatch(TOOL_NAME_RE);
|
|
58
|
+
expect(rest).toContain("Authorization: Bearer $PAPERCLIP_API_KEY");
|
|
59
|
+
expect(rest).toContain("X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID");
|
|
60
|
+
expect(rest).toContain("run_shell_command");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("paperclip MCP endpoint", () => {
|
|
64
|
+
it("normalizes the API base and encodes the toolsets", () => {
|
|
65
|
+
expect(paperclipMcpEndpoint("https://paperclip.test/", "core")).toBe("https://paperclip.test/api/mcp/paperclip?toolsets=core");
|
|
66
|
+
expect(paperclipMcpEndpoint("https://paperclip.test/api", "core,extended")).toBe("https://paperclip.test/api/mcp/paperclip?toolsets=core%2Cextended");
|
|
67
|
+
});
|
|
68
|
+
it("defaults the toolsets and drops empty entries", () => {
|
|
69
|
+
expect(paperclipMcpToolsets({})).toBe("core");
|
|
70
|
+
expect(paperclipMcpToolsets({ paperclipMcpToolsets: " , " })).toBe("core");
|
|
71
|
+
expect(paperclipMcpToolsets({ paperclipMcpToolsets: " extended , core " })).toBe("extended,core");
|
|
72
|
+
});
|
|
73
|
+
it("omits the run-id header when the run does not carry one", () => {
|
|
74
|
+
expect(paperclipMcpHttpHeaders({ apiKey: "k", runId: " " })).toEqual({
|
|
75
|
+
Authorization: "Bearer k",
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("per-runtime MCP config renderers", () => {
|
|
80
|
+
const target = paperclipMcpHttpTarget({ env: runEnv, toolsets: "core" });
|
|
81
|
+
it("resolves the endpoint and the authenticating headers once", () => {
|
|
82
|
+
expect(target).toEqual({
|
|
83
|
+
url: "https://paperclip.test/api/mcp/paperclip?toolsets=core",
|
|
84
|
+
headers: {
|
|
85
|
+
Authorization: "Bearer run-key",
|
|
86
|
+
"X-Paperclip-Run-Id": "run-7",
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it("renders the shape each runtime reads", () => {
|
|
91
|
+
expect(JSON.parse(renderPaperclipGeminiSettings(target))).toEqual({
|
|
92
|
+
mcpServers: { paperclip: { httpUrl: target.url, headers: target.headers } },
|
|
93
|
+
});
|
|
94
|
+
expect(JSON.parse(renderPaperclipOpenCodeConfig(target)).mcp.paperclip).toEqual({
|
|
95
|
+
type: "remote",
|
|
96
|
+
url: target.url,
|
|
97
|
+
enabled: true,
|
|
98
|
+
oauth: false,
|
|
99
|
+
headers: target.headers,
|
|
100
|
+
});
|
|
101
|
+
const grok = renderPaperclipGrokConfig(target);
|
|
102
|
+
expect(grok).toContain('[mcp_servers."paperclip"]');
|
|
103
|
+
expect(grok).toContain(`url = ${JSON.stringify(target.url)}`);
|
|
104
|
+
expect(grok).toContain('"Authorization" = "Bearer run-key"');
|
|
105
|
+
expect(grok).toContain('"X-Paperclip-Run-Id" = "run-7"');
|
|
106
|
+
});
|
|
107
|
+
it("keeps the credential out of the omp config file as an env reference", () => {
|
|
108
|
+
const config = JSON.parse(renderPaperclipMcpConfig({
|
|
109
|
+
enabled: true,
|
|
110
|
+
transport: "http",
|
|
111
|
+
command: { command: "paperclip-mcp-server", args: [], source: "path" },
|
|
112
|
+
toolsets: "core",
|
|
113
|
+
env: runEnv,
|
|
114
|
+
}));
|
|
115
|
+
expect(config.mcpServers.paperclip.headers.Authorization).toBe("Bearer ${PAPERCLIP_API_KEY}");
|
|
116
|
+
expect(config.mcpServers.paperclip.headers["X-Paperclip-Run-Id"]).toBe("run-7");
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=paperclip-mcp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.test.js","sourceRoot":"","sources":["../src/paperclip-mcp.test.ts"],"names":[],"mappings":"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"}
|
package/dist/server-utils.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ExecutionContinuationEnvelope } from "@tickernelz/paperclip-pro-sh
|
|
|
2
2
|
import { type ChildProcess } from "node:child_process";
|
|
3
3
|
import { type LocalProcessSandboxOptions } from "./local-process-sandbox.js";
|
|
4
4
|
import { type SshRemoteExecutionSpec } from "./ssh.js";
|
|
5
|
+
import type { PaperclipAccessMode } from "./paperclip-mcp.js";
|
|
5
6
|
import type { AdapterRuntimeToolAccess, AdapterSkillSnapshot } from "./types.js";
|
|
6
7
|
export declare function buildRuntimeToolsEnv(access: AdapterRuntimeToolAccess | null | undefined): Record<string, string>;
|
|
7
8
|
export interface RunProcessResult {
|
|
@@ -52,6 +53,8 @@ export declare function resolvePaperclipInstanceRootForAdapter(input?: {
|
|
|
52
53
|
instanceId?: string;
|
|
53
54
|
env?: NodeJS.ProcessEnv;
|
|
54
55
|
}): string;
|
|
56
|
+
/** The heartbeat contract, rendered against the Paperclip surface the adapter actually armed. */
|
|
57
|
+
export declare function paperclipAgentPromptTemplate(access: PaperclipAccessMode): string;
|
|
55
58
|
export declare const DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE: string;
|
|
56
59
|
export declare const DEFAULT_PAPERCLIP_CONVERSATION_PROMPT_TEMPLATE: string;
|
|
57
60
|
export declare const WATCHDOG_DEFAULT_MANDATE: string;
|
|
@@ -469,6 +472,7 @@ declare function renderPaperclipWakePromptBody(value: unknown, options?: {
|
|
|
469
472
|
conversationMode?: boolean;
|
|
470
473
|
nativeWakeReaderAvailable?: boolean;
|
|
471
474
|
suppressIssueDescription?: boolean;
|
|
475
|
+
paperclipAccess?: PaperclipAccessMode;
|
|
472
476
|
}): string;
|
|
473
477
|
export declare function redactEnvForLogs(env: Record<string, string>): Record<string, string>;
|
|
474
478
|
export declare function redactCommandTextForLogs(command: string): string;
|