@tickernelz/paperclip-pro-mcp-server 2026.925.0 → 2026.925.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.
- package/README.md +36 -54
- package/dist/catalog.d.ts +22 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +29 -0
- package/dist/catalog.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -1
- package/dist/generated/api-tools.json +40013 -0
- package/dist/generated/excluded-operations.json +195 -0
- package/dist/generated-tools.d.ts +64 -0
- package/dist/generated-tools.d.ts.map +1 -0
- package/dist/generated-tools.js +161 -0
- package/dist/generated-tools.js.map +1 -0
- package/dist/generated-tools.test.d.ts +2 -0
- package/dist/generated-tools.test.d.ts.map +1 -0
- package/dist/generated-tools.test.js +198 -0
- package/dist/generated-tools.test.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -6
- package/dist/index.js.map +1 -1
- package/dist/lean-schema.d.ts +3 -0
- package/dist/lean-schema.d.ts.map +1 -0
- package/dist/lean-schema.js +94 -0
- package/dist/lean-schema.js.map +1 -0
- package/dist/tool-overrides.d.ts +19 -0
- package/dist/tool-overrides.d.ts.map +1 -0
- package/dist/tool-overrides.js +220 -0
- package/dist/tool-overrides.js.map +1 -0
- package/dist/tools.d.ts +6 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +117 -32
- package/dist/tools.js.map +1 -1
- package/dist/tools.test.js +42 -0
- package/dist/tools.test.js.map +1 -1
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -14,9 +14,29 @@ The server reads its configuration from environment variables:
|
|
|
14
14
|
- `PAPERCLIP_COMPANY_ID` - optional default company for company-scoped tools
|
|
15
15
|
- `PAPERCLIP_AGENT_ID` - optional default agent for checkout helpers
|
|
16
16
|
- `PAPERCLIP_RUN_ID` - optional run id forwarded on mutating requests
|
|
17
|
+
- `PAPERCLIP_MCP_TOOLSETS` - comma-separated toolsets to register: `core` (default), `extended`, or `all`
|
|
18
|
+
- `PAPERCLIP_AGENT_ROLE` - caller role; management roles (`ceo`, `board`) also see board-authority tools
|
|
17
19
|
|
|
18
20
|
Inside an active heartbeat, Paperclip also injects `PAPERCLIP_RUNTIME_TOOLS_*` variables. They enable the run-scoped `connections_search` and `connection_request` tools and expire with the run.
|
|
19
21
|
|
|
22
|
+
## Toolsets and authority
|
|
23
|
+
|
|
24
|
+
The tool surface is generated from the server's OpenAPI registry, so it tracks the API. Two independent filters decide what a client sees:
|
|
25
|
+
|
|
26
|
+
- **Toolset.** `core` is the default: the curated hand-written tools plus the everyday generated ones (61 tools, ~94 KB of `tools/list` JSON). `extended` adds the rest of the generated surface (all toolsets, management role: 715 tools, ~537 KB). Select with `PAPERCLIP_MCP_TOOLSETS=core,extended` or `--toolsets core,extended`; the CLI flag wins, an empty or unknown value falls back to `core`.
|
|
27
|
+
- **Authority.** Every generated tool carries `authority`: `agent` for routes an ordinary agent key can call, `board` for routes whose handler asserts board authority (the deciding guard and its `file:line` are recorded in `src/generated/api-tools.json`). Board-authority tools are registered only when the caller has a management role, taken from `PAPERCLIP_AGENT_ROLE` or, when that is unset, from `GET /api/agents/me` at startup.
|
|
28
|
+
|
|
29
|
+
Instance-admin, auth/setup/cli-auth, protocol/websocket and credential-reveal routes are excluded for everyone; `src/generated/excluded-operations.json` records each excluded operation with its reason and guard evidence.
|
|
30
|
+
|
|
31
|
+
## Regenerating the tool set
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
pnpm generate:mcp-tools # rewrites src/generated/*.json from server/src/routes/openapi.ts
|
|
35
|
+
pnpm check:mcp-tools # fails when the checked-in files are stale (CI Policy lane)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Names, descriptions, toolsets and annotations are refined in `src/tool-overrides.ts`, which also holds the reviewed allow/deny lists and the routes already covered by a curated tool.
|
|
39
|
+
|
|
20
40
|
## Usage
|
|
21
41
|
|
|
22
42
|
```sh
|
|
@@ -30,61 +50,23 @@ pnpm --filter @tickernelz/paperclip-pro-mcp-server build
|
|
|
30
50
|
node packages/mcp-server/dist/stdio.js
|
|
31
51
|
```
|
|
32
52
|
|
|
53
|
+
## Server-hosted endpoint
|
|
54
|
+
|
|
55
|
+
The Paperclip server hosts the same tool surface at `POST /api/mcp/paperclip`, so a run does not have to spawn this package as a child process. It is stateless streamable HTTP: one endpoint, JSON responses, no `Mcp-Session-Id`, `GET` and `DELETE` answer `405`.
|
|
56
|
+
|
|
57
|
+
- Authentication is the REST API's: `Authorization: Bearer <run agent key>` plus `X-Paperclip-Run-Id`. Only agent actors are accepted; a board actor gets `403`, a missing credential `401`.
|
|
58
|
+
- `companyId` and `agentId` come from the authenticated agent, never from a request header, and board-authority tools are exposed only when that agent's `agentAuthorityCapabilities` include company-level authority.
|
|
59
|
+
- Toolsets come from `?toolsets=core,extended`; absent, empty or unknown values fall back to `core`.
|
|
60
|
+
- Each `tools/call` re-enters the REST API over the server's own loopback address with the caller's bearer token, so every route guard, record rule and audit hook runs exactly as it does for a direct API call.
|
|
61
|
+
|
|
62
|
+
Tool definitions are built once per process and per (toolset, authority) variant; the `tools/list` payload is memoized with them.
|
|
63
|
+
|
|
33
64
|
## Tool Surface
|
|
34
65
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- `
|
|
38
|
-
- `connection_request`
|
|
39
|
-
|
|
40
|
-
Read tools:
|
|
41
|
-
|
|
42
|
-
- `paperclipMe`
|
|
43
|
-
- `paperclipInboxLite`
|
|
44
|
-
- `paperclipListAgents`
|
|
45
|
-
- `paperclipGetAgent`
|
|
46
|
-
- `paperclipListIssues`
|
|
47
|
-
- `paperclipGetIssue`
|
|
48
|
-
- `paperclipGetHeartbeatContext`
|
|
49
|
-
- `paperclipListComments`
|
|
50
|
-
- `paperclipGetComment`
|
|
51
|
-
- `paperclipListIssueApprovals`
|
|
52
|
-
- `paperclipListDocuments`
|
|
53
|
-
- `paperclipGetDocument`
|
|
54
|
-
- `paperclipListDocumentRevisions`
|
|
55
|
-
- `paperclipListProjects`
|
|
56
|
-
- `paperclipGetProject`
|
|
57
|
-
- `paperclipGetIssueWorkspaceRuntime`
|
|
58
|
-
- `paperclipWaitForIssueWorkspaceService`
|
|
59
|
-
- `paperclipListGoals`
|
|
60
|
-
- `paperclipGetGoal`
|
|
61
|
-
- `paperclipListApprovals`
|
|
62
|
-
- `paperclipGetApproval`
|
|
63
|
-
- `paperclipGetApprovalIssues`
|
|
64
|
-
- `paperclipListApprovalComments`
|
|
65
|
-
|
|
66
|
-
Write tools:
|
|
67
|
-
|
|
68
|
-
- `paperclipCreateIssue`
|
|
69
|
-
- `paperclipUpdateIssue`
|
|
70
|
-
- `paperclipCheckoutIssue`
|
|
71
|
-
- `paperclipReleaseIssue`
|
|
72
|
-
- `paperclipAddComment`
|
|
73
|
-
- `paperclipSuggestTasks`
|
|
74
|
-
- `paperclipAskUserQuestions`
|
|
75
|
-
- `paperclipRequestConfirmation`
|
|
76
|
-
- `paperclipUpsertIssueDocument`
|
|
77
|
-
- `paperclipRestoreIssueDocumentRevision`
|
|
78
|
-
- `paperclipControlIssueWorkspaceServices`
|
|
79
|
-
- `paperclipCreateApproval`
|
|
80
|
-
- `paperclipLinkIssueApproval`
|
|
81
|
-
- `paperclipUnlinkIssueApproval`
|
|
82
|
-
- `paperclipApprovalDecision`
|
|
83
|
-
- `paperclipAddApprovalComment`
|
|
84
|
-
|
|
85
|
-
Escape hatch:
|
|
86
|
-
|
|
87
|
-
- `paperclipApiRequest`
|
|
66
|
+
Curated tools keep their names and behaviour: the run-scoped `connections_search` and `connection_request`, the issue/comment/document/approval/workspace helpers (`paperclipMe`, `paperclipInboxLite`, `paperclipListIssues`, `paperclipCheckoutIssue`, `paperclipGetHeartbeatContext`, `paperclipUpdateIssue`, `paperclipAddComment`, `paperclipUpsertIssueDocument`, `paperclipGetIssueWorkspaceRuntime`, `paperclipApprovalDecision`, and the rest), and the `paperclipApiRequest` escape hatch.
|
|
67
|
+
|
|
68
|
+
Everything else is generated from the OpenAPI registry into `src/generated/api-tools.json`, one tool per operation, with a zod input schema built from its path parameters, query parameters and JSON body, `companyId` filled from `PAPERCLIP_COMPANY_ID` when the route is company-scoped, and MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`).
|
|
88
69
|
|
|
89
70
|
`paperclipApiRequest` is limited to paths under `/api` and JSON bodies. It is
|
|
90
|
-
meant for endpoints that
|
|
71
|
+
meant for endpoints that have no dedicated MCP tool, including the credential
|
|
72
|
+
routes that are deliberately kept off the generated surface.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PaperclipApiClient } from "./client.js";
|
|
2
|
+
import { type JsonSchemaObject } from "./lean-schema.js";
|
|
3
|
+
import type { ToolsetName } from "./tool-overrides.js";
|
|
4
|
+
import { type ToolAnnotations, type ToolDefinition } from "./tools.js";
|
|
5
|
+
export { PaperclipApiClient } from "./client.js";
|
|
6
|
+
export { hasManagementAuthority, parseToolsets } from "./config.js";
|
|
7
|
+
export type { ToolsetName } from "./tool-overrides.js";
|
|
8
|
+
export type { ToolDefinition } from "./tools.js";
|
|
9
|
+
export type ToolListing = {
|
|
10
|
+
tools: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: JsonSchemaObject;
|
|
14
|
+
annotations?: ToolAnnotations;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
/** Tool definitions bound to one caller, sharing schema and listing work per variant. */
|
|
18
|
+
export declare function paperclipToolCatalog(client: PaperclipApiClient, toolsets: ReadonlyArray<ToolsetName>, management: boolean): {
|
|
19
|
+
definitions: ToolDefinition[];
|
|
20
|
+
listing: ToolListing;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAyB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,gBAAgB,CAAC;QAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,CAAC,CAAC;CACJ,CAAC;AAIF,yFAAyF;AACzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EACpC,UAAU,EAAE,OAAO,GAClB;IAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAuBzD"}
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { bindGeneratedTools, prepareGeneratedTools } from "./generated-tools.js";
|
|
3
|
+
import { leanJsonSchema } from "./lean-schema.js";
|
|
4
|
+
import { createToolDefinitions } from "./tools.js";
|
|
5
|
+
export { PaperclipApiClient } from "./client.js";
|
|
6
|
+
export { hasManagementAuthority, parseToolsets } from "./config.js";
|
|
7
|
+
const listings = new Map();
|
|
8
|
+
/** Tool definitions bound to one caller, sharing schema and listing work per variant. */
|
|
9
|
+
export function paperclipToolCatalog(client, toolsets, management) {
|
|
10
|
+
const curated = createToolDefinitions(client);
|
|
11
|
+
const curatedNames = new Set(curated.map((tool) => tool.name));
|
|
12
|
+
const generated = bindGeneratedTools(prepareGeneratedTools(toolsets, management), client).filter((tool) => !curatedNames.has(tool.name));
|
|
13
|
+
const definitions = [...curated, ...generated];
|
|
14
|
+
const key = `${[...toolsets].sort().join(",")}|${management ? "management" : "agent"}`;
|
|
15
|
+
let listing = listings.get(key);
|
|
16
|
+
if (!listing) {
|
|
17
|
+
listing = {
|
|
18
|
+
tools: definitions.map((tool) => ({
|
|
19
|
+
name: tool.name,
|
|
20
|
+
description: tool.description,
|
|
21
|
+
inputSchema: leanJsonSchema(z.toJSONSchema(tool.schema, { target: "draft-7", io: "input" })),
|
|
22
|
+
...(tool.annotations ? { annotations: tool.annotations } : {}),
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
listings.set(key, listing);
|
|
26
|
+
}
|
|
27
|
+
return { definitions, listing };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAyB,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAA6C,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAapE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEhD,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAClC,MAA0B,EAC1B,QAAoC,EACpC,UAAmB;IAEnB,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAC9F,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACvF,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG;YACR,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,cAAc,CACzB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAC5C;gBACrB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;SACJ,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import type { ToolsetName } from "./tool-overrides.js";
|
|
1
2
|
export interface PaperclipMcpConfig {
|
|
2
3
|
apiUrl: string;
|
|
3
4
|
apiKey: string;
|
|
4
5
|
companyId: string | null;
|
|
5
6
|
agentId: string | null;
|
|
6
7
|
runId: string | null;
|
|
8
|
+
toolsets: ToolsetName[];
|
|
9
|
+
agentRole: string | null;
|
|
7
10
|
}
|
|
11
|
+
export declare const MANAGEMENT_ROLES: Record<string, true>;
|
|
12
|
+
export declare function hasManagementAuthority(role: string | null | undefined): boolean;
|
|
13
|
+
export declare const TOOLSET_NAMES: ToolsetName[];
|
|
14
|
+
export declare function parseToolsets(requested: string | null | undefined): ToolsetName[];
|
|
15
|
+
export declare function resolveToolsets(env?: NodeJS.ProcessEnv, argv?: string[]): ToolsetName[];
|
|
8
16
|
export declare function normalizeApiUrl(apiUrl: string): string;
|
|
9
17
|
export declare function readConfigFromEnv(env?: NodeJS.ProcessEnv): PaperclipMcpConfig;
|
|
10
18
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAA8B,CAAC;AAEjF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAAyB,CAAC;AAEjE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,CAQjF;AAED,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAAM,EAA0B,GACrC,WAAW,EAAE,CAaf;AAUD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAmB1F"}
|
package/dist/config.js
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
export const MANAGEMENT_ROLES = { ceo: true, board: true };
|
|
2
|
+
export function hasManagementAuthority(role) {
|
|
3
|
+
return typeof role === "string" && MANAGEMENT_ROLES[role.trim().toLowerCase()] === true;
|
|
4
|
+
}
|
|
5
|
+
export const TOOLSET_NAMES = ["core", "extended"];
|
|
6
|
+
export function parseToolsets(requested) {
|
|
7
|
+
const requestedNames = (requested ?? "")
|
|
8
|
+
.split(",")
|
|
9
|
+
.map((entry) => entry.trim().toLowerCase())
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
if (requestedNames.includes("all"))
|
|
12
|
+
return [...TOOLSET_NAMES];
|
|
13
|
+
const selected = TOOLSET_NAMES.filter((name) => requestedNames.includes(name));
|
|
14
|
+
return selected.length > 0 ? selected : ["core"];
|
|
15
|
+
}
|
|
16
|
+
export function resolveToolsets(env = process.env, argv = process.argv.slice(2)) {
|
|
17
|
+
const flagIndex = argv.indexOf("--toolsets");
|
|
18
|
+
const inline = argv.find((entry) => entry.startsWith("--toolsets="));
|
|
19
|
+
const requested = (flagIndex >= 0 ? argv[flagIndex + 1] : undefined) ??
|
|
20
|
+
inline?.slice("--toolsets=".length) ??
|
|
21
|
+
env.PAPERCLIP_MCP_TOOLSETS;
|
|
22
|
+
for (const name of (requested ?? "").split(",").map((entry) => entry.trim().toLowerCase())) {
|
|
23
|
+
if (name && name !== "all" && !TOOLSET_NAMES.includes(name)) {
|
|
24
|
+
console.error(`Ignoring unknown Paperclip MCP toolset "${name}"`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return parseToolsets(requested);
|
|
28
|
+
}
|
|
1
29
|
function nonEmpty(value) {
|
|
2
30
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
3
31
|
}
|
|
@@ -23,6 +51,8 @@ export function readConfigFromEnv(env = process.env) {
|
|
|
23
51
|
companyId: nonEmpty(env.PAPERCLIP_COMPANY_ID),
|
|
24
52
|
agentId: nonEmpty(env.PAPERCLIP_AGENT_ID),
|
|
25
53
|
runId: nonEmpty(env.PAPERCLIP_RUN_ID),
|
|
54
|
+
toolsets: resolveToolsets(env),
|
|
55
|
+
agentRole: nonEmpty(env.PAPERCLIP_AGENT_ROLE),
|
|
26
56
|
};
|
|
27
57
|
}
|
|
28
58
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|