@carbon-copy/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.github/workflows/publish.yml +23 -0
  2. package/CLAUDE.md +69 -0
  3. package/LICENSE +21 -0
  4. package/README.md +108 -0
  5. package/dist/__tests__/client.test.d.ts +2 -0
  6. package/dist/__tests__/client.test.d.ts.map +1 -0
  7. package/dist/__tests__/client.test.js +292 -0
  8. package/dist/__tests__/client.test.js.map +1 -0
  9. package/dist/__tests__/resources.test.d.ts +2 -0
  10. package/dist/__tests__/resources.test.d.ts.map +1 -0
  11. package/dist/__tests__/resources.test.js +176 -0
  12. package/dist/__tests__/resources.test.js.map +1 -0
  13. package/dist/__tests__/tools.test.d.ts +2 -0
  14. package/dist/__tests__/tools.test.d.ts.map +1 -0
  15. package/dist/__tests__/tools.test.js +317 -0
  16. package/dist/__tests__/tools.test.js.map +1 -0
  17. package/dist/client.d.ts +46 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +94 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +33 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/resources/portfolio.d.ts +4 -0
  26. package/dist/resources/portfolio.d.ts.map +1 -0
  27. package/dist/resources/portfolio.js +19 -0
  28. package/dist/resources/portfolio.js.map +1 -0
  29. package/dist/resources/traders.d.ts +4 -0
  30. package/dist/resources/traders.d.ts.map +1 -0
  31. package/dist/resources/traders.js +19 -0
  32. package/dist/resources/traders.js.map +1 -0
  33. package/dist/tools/account.d.ts +4 -0
  34. package/dist/tools/account.d.ts.map +1 -0
  35. package/dist/tools/account.js +32 -0
  36. package/dist/tools/account.js.map +1 -0
  37. package/dist/tools/orders.d.ts +4 -0
  38. package/dist/tools/orders.d.ts.map +1 -0
  39. package/dist/tools/orders.js +57 -0
  40. package/dist/tools/orders.js.map +1 -0
  41. package/dist/tools/portfolio.d.ts +4 -0
  42. package/dist/tools/portfolio.d.ts.map +1 -0
  43. package/dist/tools/portfolio.js +84 -0
  44. package/dist/tools/portfolio.js.map +1 -0
  45. package/dist/tools/traders.d.ts +4 -0
  46. package/dist/tools/traders.d.ts.map +1 -0
  47. package/dist/tools/traders.js +163 -0
  48. package/dist/tools/traders.js.map +1 -0
  49. package/package.json +43 -0
  50. package/src/__tests__/client.test.ts +392 -0
  51. package/src/__tests__/resources.test.ts +263 -0
  52. package/src/__tests__/tools.test.ts +440 -0
  53. package/src/client.ts +161 -0
  54. package/src/index.ts +41 -0
  55. package/src/resources/portfolio.ts +30 -0
  56. package/src/resources/traders.ts +29 -0
  57. package/src/tools/account.ts +48 -0
  58. package/src/tools/orders.ts +74 -0
  59. package/src/tools/portfolio.ts +106 -0
  60. package/src/tools/traders.ts +207 -0
  61. package/tsconfig.json +17 -0
  62. package/vitest.config.ts +9 -0
@@ -0,0 +1,176 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { CarbonCopyClient } from "../client.js";
4
+ import { registerPortfolioResources } from "../resources/portfolio.js";
5
+ import { registerTraderResources } from "../resources/traders.js";
6
+ function getResources(server) {
7
+ return server._registeredResources;
8
+ }
9
+ function createMockFetchResponse(body = {}) {
10
+ return {
11
+ ok: true,
12
+ status: 200,
13
+ statusText: "OK",
14
+ headers: { get: () => null },
15
+ json: vi.fn().mockResolvedValue(body),
16
+ text: vi.fn().mockResolvedValue(JSON.stringify(body)),
17
+ clone: vi.fn().mockReturnValue({ json: vi.fn().mockResolvedValue(body) }),
18
+ };
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Tests
22
+ // ---------------------------------------------------------------------------
23
+ describe("Resource Registration", () => {
24
+ let server;
25
+ let client;
26
+ let fetchMock;
27
+ beforeEach(() => {
28
+ fetchMock = vi.fn();
29
+ globalThis.fetch = fetchMock;
30
+ server = new McpServer({ name: "test", version: "0.0.1" });
31
+ client = new CarbonCopyClient("cc_test");
32
+ registerPortfolioResources(server, client);
33
+ registerTraderResources(server, client);
34
+ });
35
+ afterEach(() => {
36
+ vi.restoreAllMocks();
37
+ });
38
+ // -------------------------------------------------------------------------
39
+ // Registration checks
40
+ // -------------------------------------------------------------------------
41
+ it("registers exactly 2 resources", () => {
42
+ const resources = getResources(server);
43
+ expect(Object.keys(resources)).toHaveLength(2);
44
+ });
45
+ it("registers the portfolio resource at carboncopy://portfolio", () => {
46
+ const resources = getResources(server);
47
+ expect(resources).toHaveProperty("carboncopy://portfolio");
48
+ });
49
+ it("registers the traders resource at carboncopy://traders", () => {
50
+ const resources = getResources(server);
51
+ expect(resources).toHaveProperty("carboncopy://traders");
52
+ });
53
+ it("portfolio resource has name 'portfolio'", () => {
54
+ const resources = getResources(server);
55
+ expect(resources["carboncopy://portfolio"].name).toBe("portfolio");
56
+ });
57
+ it("traders resource has name 'traders'", () => {
58
+ const resources = getResources(server);
59
+ expect(resources["carboncopy://traders"].name).toBe("traders");
60
+ });
61
+ it("portfolio resource has mimeType application/json", () => {
62
+ const resources = getResources(server);
63
+ const resource = resources["carboncopy://portfolio"];
64
+ expect(resource.metadata?.mimeType).toBe("application/json");
65
+ });
66
+ it("traders resource has mimeType application/json", () => {
67
+ const resources = getResources(server);
68
+ const resource = resources["carboncopy://traders"];
69
+ expect(resource.metadata?.mimeType).toBe("application/json");
70
+ });
71
+ it("all resources are enabled by default", () => {
72
+ const resources = getResources(server);
73
+ for (const resource of Object.values(resources)) {
74
+ expect(resource.enabled).toBe(true);
75
+ }
76
+ });
77
+ // -------------------------------------------------------------------------
78
+ // Portfolio resource — readCallback
79
+ // -------------------------------------------------------------------------
80
+ describe("portfolio resource — read", () => {
81
+ it("returns a content block with URI carboncopy://portfolio", async () => {
82
+ const portfolioData = { totalValue: 1234.56, pnl: 123.45 };
83
+ fetchMock.mockResolvedValue(createMockFetchResponse(portfolioData));
84
+ const resource = getResources(server)["carboncopy://portfolio"];
85
+ const uri = new URL("carboncopy://portfolio");
86
+ const result = (await resource.readCallback(uri, {}));
87
+ expect(result.contents).toHaveLength(1);
88
+ expect(result.contents[0].uri).toBe("carboncopy://portfolio");
89
+ });
90
+ it("returns application/json mimeType in content", async () => {
91
+ fetchMock.mockResolvedValue(createMockFetchResponse({ v: 1 }));
92
+ const resource = getResources(server)["carboncopy://portfolio"];
93
+ const result = (await resource.readCallback(new URL("carboncopy://portfolio"), {}));
94
+ expect(result.contents[0].mimeType).toBe("application/json");
95
+ });
96
+ it("returns JSON-stringified portfolio data as text", async () => {
97
+ const portfolioData = { totalValue: 500, positions: [] };
98
+ fetchMock.mockResolvedValue(createMockFetchResponse(portfolioData));
99
+ const resource = getResources(server)["carboncopy://portfolio"];
100
+ const result = (await resource.readCallback(new URL("carboncopy://portfolio"), {}));
101
+ expect(JSON.parse(result.contents[0].text)).toEqual(portfolioData);
102
+ });
103
+ it("calls GET /api/v1/portfolio when portfolio resource is read", async () => {
104
+ fetchMock.mockResolvedValue(createMockFetchResponse({}));
105
+ const resource = getResources(server)["carboncopy://portfolio"];
106
+ await resource.readCallback(new URL("carboncopy://portfolio"), {});
107
+ const [url, init] = fetchMock.mock.calls[0];
108
+ expect(url).toContain("/api/v1/portfolio");
109
+ expect(init.method).toBe("GET");
110
+ });
111
+ it("propagates API errors from the portfolio resource read", async () => {
112
+ fetchMock.mockResolvedValue({
113
+ ok: false,
114
+ status: 401,
115
+ statusText: "Unauthorized",
116
+ headers: { get: () => null },
117
+ clone: vi.fn().mockReturnValue({
118
+ json: vi.fn().mockResolvedValue({ message: "unauthorized" }),
119
+ }),
120
+ });
121
+ const resource = getResources(server)["carboncopy://portfolio"];
122
+ await expect(resource.readCallback(new URL("carboncopy://portfolio"), {})).rejects.toThrow(/Carbon Copy API error 401/);
123
+ });
124
+ });
125
+ // -------------------------------------------------------------------------
126
+ // Traders resource — readCallback
127
+ // -------------------------------------------------------------------------
128
+ describe("traders resource — read", () => {
129
+ it("returns a content block with URI carboncopy://traders", async () => {
130
+ const tradersData = [{ wallet: "0xabc", copyPercentage: 50 }];
131
+ fetchMock.mockResolvedValue(createMockFetchResponse(tradersData));
132
+ const resource = getResources(server)["carboncopy://traders"];
133
+ const result = (await resource.readCallback(new URL("carboncopy://traders"), {}));
134
+ expect(result.contents).toHaveLength(1);
135
+ expect(result.contents[0].uri).toBe("carboncopy://traders");
136
+ });
137
+ it("returns application/json mimeType in content", async () => {
138
+ fetchMock.mockResolvedValue(createMockFetchResponse([]));
139
+ const resource = getResources(server)["carboncopy://traders"];
140
+ const result = (await resource.readCallback(new URL("carboncopy://traders"), {}));
141
+ expect(result.contents[0].mimeType).toBe("application/json");
142
+ });
143
+ it("returns JSON-stringified traders list as text", async () => {
144
+ const tradersData = [
145
+ { wallet: "0xabc", copyPercentage: 50 },
146
+ { wallet: "0xdef", copyPercentage: 25 },
147
+ ];
148
+ fetchMock.mockResolvedValue(createMockFetchResponse(tradersData));
149
+ const resource = getResources(server)["carboncopy://traders"];
150
+ const result = (await resource.readCallback(new URL("carboncopy://traders"), {}));
151
+ expect(JSON.parse(result.contents[0].text)).toEqual(tradersData);
152
+ });
153
+ it("calls GET /api/v1/traders when traders resource is read", async () => {
154
+ fetchMock.mockResolvedValue(createMockFetchResponse([]));
155
+ const resource = getResources(server)["carboncopy://traders"];
156
+ await resource.readCallback(new URL("carboncopy://traders"), {});
157
+ const [url, init] = fetchMock.mock.calls[0];
158
+ expect(url).toContain("/api/v1/traders");
159
+ expect(init.method).toBe("GET");
160
+ });
161
+ it("propagates API errors from the traders resource read", async () => {
162
+ fetchMock.mockResolvedValue({
163
+ ok: false,
164
+ status: 403,
165
+ statusText: "Forbidden",
166
+ headers: { get: () => null },
167
+ clone: vi.fn().mockReturnValue({
168
+ json: vi.fn().mockResolvedValue({ message: "forbidden" }),
169
+ }),
170
+ });
171
+ const resource = getResources(server)["carboncopy://traders"];
172
+ await expect(resource.readCallback(new URL("carboncopy://traders"), {})).rejects.toThrow(/Carbon Copy API error 403/);
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=resources.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.test.js","sourceRoot":"","sources":["../../src/__tests__/resources.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,317 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { CarbonCopyClient } from "../client.js";
4
+ import { registerPortfolioTools } from "../tools/portfolio.js";
5
+ import { registerTraderTools } from "../tools/traders.js";
6
+ import { registerOrderTools } from "../tools/orders.js";
7
+ import { registerAccountTools } from "../tools/account.js";
8
+ function getTools(server) {
9
+ return server._registeredTools;
10
+ }
11
+ function createMockFetchResponse(body = {}) {
12
+ return {
13
+ ok: true,
14
+ status: 200,
15
+ statusText: "OK",
16
+ headers: { get: () => null },
17
+ json: vi.fn().mockResolvedValue(body),
18
+ text: vi.fn().mockResolvedValue(JSON.stringify(body)),
19
+ clone: vi.fn().mockReturnValue({ json: vi.fn().mockResolvedValue(body) }),
20
+ };
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // Setup
24
+ // ---------------------------------------------------------------------------
25
+ const ALL_TOOL_NAMES = [
26
+ "get_portfolio",
27
+ "get_portfolio_history",
28
+ "get_positions",
29
+ "list_traders",
30
+ "follow_trader",
31
+ "get_trader",
32
+ "update_trader",
33
+ "unfollow_trader",
34
+ "pause_trader",
35
+ "resume_trader",
36
+ "list_orders",
37
+ "get_order",
38
+ "get_account",
39
+ "health",
40
+ ];
41
+ describe("Tool Registration", () => {
42
+ let server;
43
+ let client;
44
+ let fetchMock;
45
+ beforeEach(() => {
46
+ fetchMock = vi.fn();
47
+ globalThis.fetch = fetchMock;
48
+ server = new McpServer({ name: "test", version: "0.0.1" });
49
+ client = new CarbonCopyClient("cc_test");
50
+ registerPortfolioTools(server, client);
51
+ registerTraderTools(server, client);
52
+ registerOrderTools(server, client);
53
+ registerAccountTools(server, client);
54
+ });
55
+ afterEach(() => {
56
+ vi.restoreAllMocks();
57
+ });
58
+ // -------------------------------------------------------------------------
59
+ // Count & names
60
+ // -------------------------------------------------------------------------
61
+ it("registers exactly 14 tools", () => {
62
+ const tools = getTools(server);
63
+ expect(Object.keys(tools)).toHaveLength(14);
64
+ });
65
+ it("registers all expected tool names", () => {
66
+ const tools = getTools(server);
67
+ for (const name of ALL_TOOL_NAMES) {
68
+ expect(tools).toHaveProperty(name);
69
+ }
70
+ });
71
+ it("all registered tools are enabled by default", () => {
72
+ const tools = getTools(server);
73
+ for (const tool of Object.values(tools)) {
74
+ expect(tool.enabled).toBe(true);
75
+ }
76
+ });
77
+ // -------------------------------------------------------------------------
78
+ // Annotations
79
+ // -------------------------------------------------------------------------
80
+ describe("tool annotations", () => {
81
+ it("get_portfolio — readOnlyHint:true, no destructiveHint", () => {
82
+ const { annotations } = getTools(server)["get_portfolio"];
83
+ expect(annotations?.readOnlyHint).toBe(true);
84
+ expect(annotations?.destructiveHint).toBeUndefined();
85
+ expect(annotations?.idempotentHint).toBeUndefined();
86
+ });
87
+ it("get_portfolio_history — readOnlyHint:true", () => {
88
+ const { annotations } = getTools(server)["get_portfolio_history"];
89
+ expect(annotations?.readOnlyHint).toBe(true);
90
+ });
91
+ it("get_positions — readOnlyHint:true", () => {
92
+ const { annotations } = getTools(server)["get_positions"];
93
+ expect(annotations?.readOnlyHint).toBe(true);
94
+ });
95
+ it("list_traders — readOnlyHint:true", () => {
96
+ const { annotations } = getTools(server)["list_traders"];
97
+ expect(annotations?.readOnlyHint).toBe(true);
98
+ });
99
+ it("follow_trader — readOnlyHint:false, no destructiveHint", () => {
100
+ const { annotations } = getTools(server)["follow_trader"];
101
+ expect(annotations?.readOnlyHint).toBe(false);
102
+ expect(annotations?.destructiveHint).toBeUndefined();
103
+ });
104
+ it("get_trader — readOnlyHint:true", () => {
105
+ const { annotations } = getTools(server)["get_trader"];
106
+ expect(annotations?.readOnlyHint).toBe(true);
107
+ });
108
+ it("update_trader — readOnlyHint:false, idempotentHint:true", () => {
109
+ const { annotations } = getTools(server)["update_trader"];
110
+ expect(annotations?.readOnlyHint).toBe(false);
111
+ expect(annotations?.idempotentHint).toBe(true);
112
+ });
113
+ it("unfollow_trader — readOnlyHint:false, destructiveHint:true", () => {
114
+ const { annotations } = getTools(server)["unfollow_trader"];
115
+ expect(annotations?.readOnlyHint).toBe(false);
116
+ expect(annotations?.destructiveHint).toBe(true);
117
+ });
118
+ it("pause_trader — readOnlyHint:false, idempotentHint:true", () => {
119
+ const { annotations } = getTools(server)["pause_trader"];
120
+ expect(annotations?.readOnlyHint).toBe(false);
121
+ expect(annotations?.idempotentHint).toBe(true);
122
+ });
123
+ it("resume_trader — readOnlyHint:false, idempotentHint:true", () => {
124
+ const { annotations } = getTools(server)["resume_trader"];
125
+ expect(annotations?.readOnlyHint).toBe(false);
126
+ expect(annotations?.idempotentHint).toBe(true);
127
+ });
128
+ it("list_orders — readOnlyHint:true", () => {
129
+ const { annotations } = getTools(server)["list_orders"];
130
+ expect(annotations?.readOnlyHint).toBe(true);
131
+ });
132
+ it("get_order — readOnlyHint:true", () => {
133
+ const { annotations } = getTools(server)["get_order"];
134
+ expect(annotations?.readOnlyHint).toBe(true);
135
+ });
136
+ it("get_account — readOnlyHint:true", () => {
137
+ const { annotations } = getTools(server)["get_account"];
138
+ expect(annotations?.readOnlyHint).toBe(true);
139
+ });
140
+ it("health — readOnlyHint:true", () => {
141
+ const { annotations } = getTools(server)["health"];
142
+ expect(annotations?.readOnlyHint).toBe(true);
143
+ });
144
+ });
145
+ // -------------------------------------------------------------------------
146
+ // Tool execution — verify handlers call client and return content
147
+ // -------------------------------------------------------------------------
148
+ describe("tool execution", () => {
149
+ it("get_portfolio — calls getPortfolio() and returns JSON text", async () => {
150
+ const responseData = { totalValue: 1000, pnl: 50 };
151
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
152
+ const tool = getTools(server)["get_portfolio"];
153
+ const result = (await tool.handler({}, {}));
154
+ expect(result.content).toHaveLength(1);
155
+ expect(result.content[0].type).toBe("text");
156
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
157
+ });
158
+ it("get_portfolio_history — passes params and returns JSON text", async () => {
159
+ const responseData = { items: [], cursor: null };
160
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
161
+ const tool = getTools(server)["get_portfolio_history"];
162
+ const result = (await tool.handler({ limit: 10, cursor: "abc" }, {}));
163
+ expect(result.content[0].type).toBe("text");
164
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
165
+ // Verify the correct URL was fetched
166
+ const [url] = fetchMock.mock.calls[0];
167
+ expect(url).toContain("/api/v1/portfolio/history");
168
+ expect(url).toContain("limit=10");
169
+ expect(url).toContain("cursor=abc");
170
+ });
171
+ it("get_positions — calls getPositions() and returns JSON text", async () => {
172
+ const responseData = { positions: [] };
173
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
174
+ const tool = getTools(server)["get_positions"];
175
+ const result = (await tool.handler({}, {}));
176
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
177
+ const [url] = fetchMock.mock.calls[0];
178
+ expect(url).toContain("/api/v1/portfolio/positions");
179
+ });
180
+ it("list_traders — calls getTraders() and returns JSON text", async () => {
181
+ const responseData = [{ wallet: "0xabc", copyPercentage: 50 }];
182
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
183
+ const tool = getTools(server)["list_traders"];
184
+ const result = (await tool.handler({}, {}));
185
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
186
+ const [url] = fetchMock.mock.calls[0];
187
+ expect(url).toContain("/api/v1/traders");
188
+ });
189
+ it("follow_trader — posts follow request and returns JSON text", async () => {
190
+ const responseData = { id: "follow-1", wallet: "0xabc" };
191
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
192
+ const tool = getTools(server)["follow_trader"];
193
+ const args = { walletAddress: "0xabc", copyPercentage: 50 };
194
+ const result = (await tool.handler(args, {}));
195
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
196
+ const [url, init] = fetchMock.mock.calls[0];
197
+ expect(url).toContain("/api/v1/traders");
198
+ expect(init.method).toBe("POST");
199
+ expect(JSON.parse(init.body)).toMatchObject(args);
200
+ });
201
+ it("get_trader — calls getTrader(wallet) and returns JSON text", async () => {
202
+ const responseData = { wallet: "0xabc", copyPercentage: 50 };
203
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
204
+ const tool = getTools(server)["get_trader"];
205
+ const result = (await tool.handler({ wallet: "0xabc" }, {}));
206
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
207
+ const [url] = fetchMock.mock.calls[0];
208
+ expect(url).toContain("/api/v1/traders/0xabc");
209
+ });
210
+ it("update_trader — patches trader settings and returns JSON text", async () => {
211
+ const responseData = { wallet: "0xabc", copyPercentage: 75 };
212
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
213
+ const tool = getTools(server)["update_trader"];
214
+ const result = (await tool.handler({ wallet: "0xabc", copyPercentage: 75 }, {}));
215
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
216
+ const [url, init] = fetchMock.mock.calls[0];
217
+ expect(url).toContain("/api/v1/traders/0xabc");
218
+ expect(init.method).toBe("PATCH");
219
+ expect(JSON.parse(init.body)).toEqual({ copyPercentage: 75 });
220
+ });
221
+ it("unfollow_trader — deletes trader and returns JSON text (null body)", async () => {
222
+ fetchMock.mockResolvedValue({
223
+ ok: true,
224
+ status: 204,
225
+ statusText: "No Content",
226
+ headers: { get: () => null },
227
+ json: vi.fn(),
228
+ text: vi.fn(),
229
+ clone: vi.fn(),
230
+ });
231
+ const tool = getTools(server)["unfollow_trader"];
232
+ const result = (await tool.handler({ wallet: "0xabc" }, {}));
233
+ expect(result.content[0].type).toBe("text");
234
+ expect(JSON.parse(result.content[0].text)).toEqual({ success: true });
235
+ const [url, init] = fetchMock.mock.calls[0];
236
+ expect(url).toContain("/api/v1/traders/0xabc");
237
+ expect(init.method).toBe("DELETE");
238
+ });
239
+ it("pause_trader — pauses trader and returns JSON text", async () => {
240
+ const responseData = { paused: true };
241
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
242
+ const tool = getTools(server)["pause_trader"];
243
+ const result = (await tool.handler({ wallet: "0xabc" }, {}));
244
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
245
+ const [url, init] = fetchMock.mock.calls[0];
246
+ expect(url).toContain("/api/v1/traders/0xabc/pause");
247
+ expect(init.method).toBe("POST");
248
+ });
249
+ it("resume_trader — resumes trader and returns JSON text", async () => {
250
+ const responseData = { paused: false };
251
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
252
+ const tool = getTools(server)["resume_trader"];
253
+ const result = (await tool.handler({ wallet: "0xabc" }, {}));
254
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
255
+ const [url, init] = fetchMock.mock.calls[0];
256
+ expect(url).toContain("/api/v1/traders/0xabc/resume");
257
+ expect(init.method).toBe("POST");
258
+ });
259
+ it("list_orders — calls getOrders() with params and returns JSON text", async () => {
260
+ const responseData = { orders: [], cursor: null };
261
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
262
+ const tool = getTools(server)["list_orders"];
263
+ const result = (await tool.handler({ status: "filled" }, {}));
264
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
265
+ const [url] = fetchMock.mock.calls[0];
266
+ expect(url).toContain("/api/v1/orders");
267
+ expect(url).toContain("status=filled");
268
+ });
269
+ it("get_order — calls getOrder(id) and returns JSON text", async () => {
270
+ const responseData = { id: "id123", status: "filled" };
271
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
272
+ const tool = getTools(server)["get_order"];
273
+ const result = (await tool.handler({ id: "id123" }, {}));
274
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
275
+ const [url] = fetchMock.mock.calls[0];
276
+ expect(url).toContain("/api/v1/orders/id123");
277
+ });
278
+ it("get_account — calls getAccount() and returns JSON text", async () => {
279
+ const responseData = { wallet: "0xuser", balance: 500 };
280
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
281
+ const tool = getTools(server)["get_account"];
282
+ const result = (await tool.handler({}, {}));
283
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
284
+ const [url] = fetchMock.mock.calls[0];
285
+ expect(url).toContain("/api/v1/account");
286
+ });
287
+ it("health — calls health() and returns JSON text", async () => {
288
+ const responseData = { status: "ok" };
289
+ fetchMock.mockResolvedValue(createMockFetchResponse(responseData));
290
+ const tool = getTools(server)["health"];
291
+ const result = (await tool.handler({}, {}));
292
+ expect(JSON.parse(result.content[0].text)).toEqual(responseData);
293
+ const [url] = fetchMock.mock.calls[0];
294
+ expect(url).toContain("/api/v1/health");
295
+ });
296
+ });
297
+ // -------------------------------------------------------------------------
298
+ // Error propagation through tools
299
+ // -------------------------------------------------------------------------
300
+ describe("tool error propagation", () => {
301
+ it("get_portfolio rejects when client throws an API error", async () => {
302
+ fetchMock.mockResolvedValue({
303
+ ok: false,
304
+ status: 403,
305
+ statusText: "Forbidden",
306
+ headers: { get: () => null },
307
+ json: vi.fn().mockResolvedValue({ message: "forbidden" }),
308
+ clone: vi.fn().mockReturnValue({
309
+ json: vi.fn().mockResolvedValue({ message: "forbidden" }),
310
+ }),
311
+ });
312
+ const tool = getTools(server)["get_portfolio"];
313
+ await expect(tool.handler({}, {})).rejects.toThrow(/Carbon Copy API error 403/);
314
+ });
315
+ });
316
+ });
317
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare class CarbonCopyClient {
2
+ private readonly apiKey;
3
+ constructor(apiKey: string);
4
+ private request;
5
+ getPortfolio(): Promise<unknown>;
6
+ getPortfolioHistory(params?: {
7
+ limit?: number;
8
+ cursor?: string;
9
+ since?: string;
10
+ until?: string;
11
+ }): Promise<unknown>;
12
+ getPositions(params?: {
13
+ limit?: number;
14
+ cursor?: string;
15
+ since?: string;
16
+ until?: string;
17
+ }): Promise<unknown>;
18
+ getTraders(): Promise<unknown>;
19
+ followTrader(body: {
20
+ walletAddress: string;
21
+ copyPercentage: number;
22
+ maxCopyAmount?: number;
23
+ notificationsEnabled?: boolean;
24
+ }): Promise<unknown>;
25
+ getTrader(wallet: string): Promise<unknown>;
26
+ updateTrader(wallet: string, body: {
27
+ copyPercentage?: number;
28
+ maxCopyAmount?: number;
29
+ notificationsEnabled?: boolean;
30
+ copyTradingEnabled?: boolean;
31
+ }): Promise<unknown>;
32
+ unfollowTrader(wallet: string): Promise<unknown>;
33
+ pauseTrader(wallet: string): Promise<unknown>;
34
+ resumeTrader(wallet: string): Promise<unknown>;
35
+ getOrders(params?: {
36
+ status?: string;
37
+ limit?: number;
38
+ cursor?: string;
39
+ since?: string;
40
+ until?: string;
41
+ }): Promise<unknown>;
42
+ getOrder(id: string): Promise<unknown>;
43
+ getAccount(): Promise<unknown>;
44
+ health(): Promise<unknown>;
45
+ }
46
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;YAIZ,OAAO;IAwCrB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,mBAAmB,CAAC,MAAM,CAAC,EAAE;QAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpB,YAAY,CAAC,MAAM,CAAC,EAAE;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,YAAY,CAAC,IAAI,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C,YAAY,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QACJ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GACA,OAAO,CAAC,OAAO,CAAC;IAQnB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,SAAS,CAAC,MAAM,CAAC,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAG3B"}