@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.
- package/.github/workflows/publish.yml +23 -0
- package/CLAUDE.md +69 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/__tests__/client.test.d.ts +2 -0
- package/dist/__tests__/client.test.d.ts.map +1 -0
- package/dist/__tests__/client.test.js +292 -0
- package/dist/__tests__/client.test.js.map +1 -0
- package/dist/__tests__/resources.test.d.ts +2 -0
- package/dist/__tests__/resources.test.d.ts.map +1 -0
- package/dist/__tests__/resources.test.js +176 -0
- package/dist/__tests__/resources.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +317 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +94 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/portfolio.d.ts +4 -0
- package/dist/resources/portfolio.d.ts.map +1 -0
- package/dist/resources/portfolio.js +19 -0
- package/dist/resources/portfolio.js.map +1 -0
- package/dist/resources/traders.d.ts +4 -0
- package/dist/resources/traders.d.ts.map +1 -0
- package/dist/resources/traders.js +19 -0
- package/dist/resources/traders.js.map +1 -0
- package/dist/tools/account.d.ts +4 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +32 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/orders.d.ts +4 -0
- package/dist/tools/orders.d.ts.map +1 -0
- package/dist/tools/orders.js +57 -0
- package/dist/tools/orders.js.map +1 -0
- package/dist/tools/portfolio.d.ts +4 -0
- package/dist/tools/portfolio.d.ts.map +1 -0
- package/dist/tools/portfolio.js +84 -0
- package/dist/tools/portfolio.js.map +1 -0
- package/dist/tools/traders.d.ts +4 -0
- package/dist/tools/traders.d.ts.map +1 -0
- package/dist/tools/traders.js +163 -0
- package/dist/tools/traders.js.map +1 -0
- package/package.json +43 -0
- package/src/__tests__/client.test.ts +392 -0
- package/src/__tests__/resources.test.ts +263 -0
- package/src/__tests__/tools.test.ts +440 -0
- package/src/client.ts +161 -0
- package/src/index.ts +41 -0
- package/src/resources/portfolio.ts +30 -0
- package/src/resources/traders.ts +29 -0
- package/src/tools/account.ts +48 -0
- package/src/tools/orders.ts +74 -0
- package/src/tools/portfolio.ts +106 -0
- package/src/tools/traders.ts +207 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +9 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const BASE_URL = "https://carboncopy.news";
|
|
2
|
+
function buildQuery(params) {
|
|
3
|
+
const qs = Object.entries(params)
|
|
4
|
+
.filter(([, v]) => v !== undefined)
|
|
5
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
|
|
6
|
+
.join("&");
|
|
7
|
+
return qs ? `?${qs}` : "";
|
|
8
|
+
}
|
|
9
|
+
export class CarbonCopyClient {
|
|
10
|
+
apiKey;
|
|
11
|
+
constructor(apiKey) {
|
|
12
|
+
this.apiKey = apiKey;
|
|
13
|
+
}
|
|
14
|
+
async request(method, path, body) {
|
|
15
|
+
const url = `${BASE_URL}${path}`;
|
|
16
|
+
const headers = {
|
|
17
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
};
|
|
20
|
+
const res = await fetch(url, {
|
|
21
|
+
method,
|
|
22
|
+
headers,
|
|
23
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const cloned = res.clone();
|
|
27
|
+
let errorBody;
|
|
28
|
+
try {
|
|
29
|
+
errorBody = await cloned.json();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
errorBody = await res.text();
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`Carbon Copy API error ${res.status} ${res.statusText}: ${JSON.stringify(errorBody)}`);
|
|
35
|
+
}
|
|
36
|
+
if (res.status === 204 || res.headers.get("content-length") === "0") {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const text = await res.text();
|
|
40
|
+
if (!text)
|
|
41
|
+
return undefined;
|
|
42
|
+
return JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
// Portfolio
|
|
45
|
+
getPortfolio() {
|
|
46
|
+
return this.request("GET", "/api/v1/portfolio");
|
|
47
|
+
}
|
|
48
|
+
getPortfolioHistory(params) {
|
|
49
|
+
const qs = buildQuery(params ?? {});
|
|
50
|
+
return this.request("GET", `/api/v1/portfolio/history${qs}`);
|
|
51
|
+
}
|
|
52
|
+
getPositions(params) {
|
|
53
|
+
const qs = buildQuery(params ?? {});
|
|
54
|
+
return this.request("GET", `/api/v1/portfolio/positions${qs}`);
|
|
55
|
+
}
|
|
56
|
+
// Traders
|
|
57
|
+
getTraders() {
|
|
58
|
+
return this.request("GET", "/api/v1/traders");
|
|
59
|
+
}
|
|
60
|
+
followTrader(body) {
|
|
61
|
+
return this.request("POST", "/api/v1/traders", body);
|
|
62
|
+
}
|
|
63
|
+
getTrader(wallet) {
|
|
64
|
+
return this.request("GET", `/api/v1/traders/${encodeURIComponent(wallet)}`);
|
|
65
|
+
}
|
|
66
|
+
updateTrader(wallet, body) {
|
|
67
|
+
return this.request("PATCH", `/api/v1/traders/${encodeURIComponent(wallet)}`, body);
|
|
68
|
+
}
|
|
69
|
+
unfollowTrader(wallet) {
|
|
70
|
+
return this.request("DELETE", `/api/v1/traders/${encodeURIComponent(wallet)}`);
|
|
71
|
+
}
|
|
72
|
+
pauseTrader(wallet) {
|
|
73
|
+
return this.request("POST", `/api/v1/traders/${encodeURIComponent(wallet)}/pause`);
|
|
74
|
+
}
|
|
75
|
+
resumeTrader(wallet) {
|
|
76
|
+
return this.request("POST", `/api/v1/traders/${encodeURIComponent(wallet)}/resume`);
|
|
77
|
+
}
|
|
78
|
+
// Orders
|
|
79
|
+
getOrders(params) {
|
|
80
|
+
const qs = buildQuery(params ?? {});
|
|
81
|
+
return this.request("GET", `/api/v1/orders${qs}`);
|
|
82
|
+
}
|
|
83
|
+
getOrder(id) {
|
|
84
|
+
return this.request("GET", `/api/v1/orders/${encodeURIComponent(id)}`);
|
|
85
|
+
}
|
|
86
|
+
// Account
|
|
87
|
+
getAccount() {
|
|
88
|
+
return this.request("GET", "/api/v1/account");
|
|
89
|
+
}
|
|
90
|
+
health() {
|
|
91
|
+
return this.request("GET", "/api/v1/health");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CarbonCopyClient } from "./client.js";
|
|
5
|
+
import { registerPortfolioTools } from "./tools/portfolio.js";
|
|
6
|
+
import { registerTraderTools } from "./tools/traders.js";
|
|
7
|
+
import { registerOrderTools } from "./tools/orders.js";
|
|
8
|
+
import { registerAccountTools } from "./tools/account.js";
|
|
9
|
+
import { registerPortfolioResources } from "./resources/portfolio.js";
|
|
10
|
+
import { registerTraderResources } from "./resources/traders.js";
|
|
11
|
+
const apiKey = process.env.CARBONCOPY_API_KEY;
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
console.error("Error: CARBONCOPY_API_KEY environment variable is required.\n" +
|
|
14
|
+
"Set it to your Carbon Copy API key (format: cc_<64 hex chars>).");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const client = new CarbonCopyClient(apiKey);
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: "carboncopy",
|
|
20
|
+
version: "0.1.0",
|
|
21
|
+
});
|
|
22
|
+
// Register tools
|
|
23
|
+
registerPortfolioTools(server, client);
|
|
24
|
+
registerTraderTools(server, client);
|
|
25
|
+
registerOrderTools(server, client);
|
|
26
|
+
registerAccountTools(server, client);
|
|
27
|
+
// Register resources
|
|
28
|
+
registerPortfolioResources(server, client);
|
|
29
|
+
registerTraderResources(server, client);
|
|
30
|
+
// Connect via stdio transport
|
|
31
|
+
const transport = new StdioServerTransport();
|
|
32
|
+
await server.connect(transport);
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CACX,+DAA+D;QAC7D,iEAAiE,CACpE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,iBAAiB;AACjB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,qBAAqB;AACrB,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExC,8BAA8B;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/resources/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAuBN"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function registerPortfolioResources(server, client) {
|
|
2
|
+
server.registerResource("portfolio", "carboncopy://portfolio", {
|
|
3
|
+
title: "Carbon Copy Portfolio",
|
|
4
|
+
description: "Current portfolio snapshot including total value, P&L, and allocation.",
|
|
5
|
+
mimeType: "application/json",
|
|
6
|
+
}, async () => {
|
|
7
|
+
const data = await client.getPortfolio();
|
|
8
|
+
return {
|
|
9
|
+
contents: [
|
|
10
|
+
{
|
|
11
|
+
uri: "carboncopy://portfolio",
|
|
12
|
+
mimeType: "application/json",
|
|
13
|
+
text: JSON.stringify(data ?? {}, null, 2),
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/resources/portfolio.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CACxC,MAAiB,EACjB,MAAwB;IAExB,MAAM,CAAC,gBAAgB,CACrB,WAAW,EACX,wBAAwB,EACxB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,wEAAwE;QAC1E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,wBAAwB;oBAC7B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traders.d.ts","sourceRoot":"","sources":["../../src/resources/traders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function registerTraderResources(server, client) {
|
|
2
|
+
server.registerResource("traders", "carboncopy://traders", {
|
|
3
|
+
title: "Carbon Copy Traders",
|
|
4
|
+
description: "List of all traders you are currently following.",
|
|
5
|
+
mimeType: "application/json",
|
|
6
|
+
}, async () => {
|
|
7
|
+
const data = await client.getTraders();
|
|
8
|
+
return {
|
|
9
|
+
contents: [
|
|
10
|
+
{
|
|
11
|
+
uri: "carboncopy://traders",
|
|
12
|
+
mimeType: "application/json",
|
|
13
|
+
text: JSON.stringify(data ?? [], null, 2),
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=traders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traders.js","sourceRoot":"","sources":["../../src/resources/traders.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAwB;IAExB,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,sBAAsB,EACtB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,kDAAkD;QAC/D,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,sBAAsB;oBAC3B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/tools/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAwCN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerAccountTools(server, client) {
|
|
3
|
+
server.registerTool("get_account", {
|
|
4
|
+
title: "Get Account",
|
|
5
|
+
description: "Retrieve your Carbon Copy account details including wallet address, balance, and settings.",
|
|
6
|
+
inputSchema: z.object({}),
|
|
7
|
+
annotations: {
|
|
8
|
+
readOnlyHint: true,
|
|
9
|
+
openWorldHint: false,
|
|
10
|
+
},
|
|
11
|
+
}, async () => {
|
|
12
|
+
const data = await client.getAccount();
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("health", {
|
|
18
|
+
title: "Health Check",
|
|
19
|
+
description: "Check the health and availability of the Carbon Copy API.",
|
|
20
|
+
inputSchema: z.object({}),
|
|
21
|
+
annotations: {
|
|
22
|
+
readOnlyHint: true,
|
|
23
|
+
openWorldHint: false,
|
|
24
|
+
},
|
|
25
|
+
}, async () => {
|
|
26
|
+
const data = await client.health();
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/tools/account.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAwB;IAExB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,4FAA4F;QAC9F,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,2DAA2D;QAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkEN"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerOrderTools(server, client) {
|
|
3
|
+
server.registerTool("list_orders", {
|
|
4
|
+
title: "List Orders",
|
|
5
|
+
description: "Retrieve a list of copy-trade orders with optional status filter, pagination, and date range.",
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
status: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Filter by order status (e.g. 'pending', 'filled', 'cancelled')."),
|
|
11
|
+
limit: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Maximum number of records to return."),
|
|
17
|
+
cursor: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Pagination cursor from a previous response."),
|
|
21
|
+
since: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("ISO 8601 timestamp — only return records after this time."),
|
|
25
|
+
until: z
|
|
26
|
+
.string()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("ISO 8601 timestamp — only return records before this time."),
|
|
29
|
+
}),
|
|
30
|
+
annotations: {
|
|
31
|
+
readOnlyHint: true,
|
|
32
|
+
openWorldHint: false,
|
|
33
|
+
},
|
|
34
|
+
}, async (params) => {
|
|
35
|
+
const data = await client.getOrders(params);
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
server.registerTool("get_order", {
|
|
41
|
+
title: "Get Order",
|
|
42
|
+
description: "Retrieve details about a specific copy-trade order by ID.",
|
|
43
|
+
inputSchema: z.object({
|
|
44
|
+
id: z.string().describe("The order ID to retrieve."),
|
|
45
|
+
}),
|
|
46
|
+
annotations: {
|
|
47
|
+
readOnlyHint: true,
|
|
48
|
+
openWorldHint: false,
|
|
49
|
+
},
|
|
50
|
+
}, async ({ id }) => {
|
|
51
|
+
const data = await client.getOrder(id);
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=orders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAwB;IAExB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,+FAA+F;QACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,iEAAiE,CAClE;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,EAAE;iBACV,QAAQ,CAAC,sCAAsC,CAAC;YACnD,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;YAC1D,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2DAA2D,CAAC;YACxE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;SAC1E,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACrD,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkGN"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerPortfolioTools(server, client) {
|
|
3
|
+
server.registerTool("get_portfolio", {
|
|
4
|
+
title: "Get Portfolio",
|
|
5
|
+
description: "Retrieve the current portfolio summary including total value, P&L, and allocation.",
|
|
6
|
+
inputSchema: z.object({}),
|
|
7
|
+
annotations: {
|
|
8
|
+
readOnlyHint: true,
|
|
9
|
+
openWorldHint: false,
|
|
10
|
+
},
|
|
11
|
+
}, async () => {
|
|
12
|
+
const data = await client.getPortfolio();
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("get_portfolio_history", {
|
|
18
|
+
title: "Get Portfolio History",
|
|
19
|
+
description: "Retrieve historical portfolio snapshots with optional pagination and date filtering.",
|
|
20
|
+
inputSchema: z.object({
|
|
21
|
+
limit: z
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.positive()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Maximum number of records to return."),
|
|
27
|
+
cursor: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Pagination cursor from a previous response."),
|
|
31
|
+
since: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("ISO 8601 timestamp — only return records after this time."),
|
|
35
|
+
until: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("ISO 8601 timestamp — only return records before this time."),
|
|
39
|
+
}),
|
|
40
|
+
annotations: {
|
|
41
|
+
readOnlyHint: true,
|
|
42
|
+
openWorldHint: false,
|
|
43
|
+
},
|
|
44
|
+
}, async (params) => {
|
|
45
|
+
const data = await client.getPortfolioHistory(params);
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
server.registerTool("get_positions", {
|
|
51
|
+
title: "Get Positions",
|
|
52
|
+
description: "Retrieve current or historical portfolio positions with optional pagination and date filtering.",
|
|
53
|
+
inputSchema: z.object({
|
|
54
|
+
limit: z
|
|
55
|
+
.number()
|
|
56
|
+
.int()
|
|
57
|
+
.positive()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Maximum number of records to return."),
|
|
60
|
+
cursor: z
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("Pagination cursor from a previous response."),
|
|
64
|
+
since: z
|
|
65
|
+
.string()
|
|
66
|
+
.optional()
|
|
67
|
+
.describe("ISO 8601 timestamp — only return records after this time."),
|
|
68
|
+
until: z
|
|
69
|
+
.string()
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("ISO 8601 timestamp — only return records before this time."),
|
|
72
|
+
}),
|
|
73
|
+
annotations: {
|
|
74
|
+
readOnlyHint: true,
|
|
75
|
+
openWorldHint: false,
|
|
76
|
+
},
|
|
77
|
+
}, async (params) => {
|
|
78
|
+
const data = await client.getPositions(params);
|
|
79
|
+
return {
|
|
80
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traders.d.ts","sourceRoot":"","sources":["../../src/tools/traders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAuMN"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerTraderTools(server, client) {
|
|
3
|
+
server.registerTool("list_traders", {
|
|
4
|
+
title: "List Traders",
|
|
5
|
+
description: "List all traders you are currently following.",
|
|
6
|
+
inputSchema: z.object({}),
|
|
7
|
+
annotations: {
|
|
8
|
+
readOnlyHint: true,
|
|
9
|
+
openWorldHint: false,
|
|
10
|
+
},
|
|
11
|
+
}, async () => {
|
|
12
|
+
const data = await client.getTraders();
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("follow_trader", {
|
|
18
|
+
title: "Follow Trader",
|
|
19
|
+
description: "Start copy-trading a Polymarket trader by their wallet address.",
|
|
20
|
+
inputSchema: z.object({
|
|
21
|
+
walletAddress: z
|
|
22
|
+
.string()
|
|
23
|
+
.describe("The Polymarket wallet address of the trader to follow."),
|
|
24
|
+
copyPercentage: z
|
|
25
|
+
.number()
|
|
26
|
+
.min(0)
|
|
27
|
+
.max(100)
|
|
28
|
+
.describe("Percentage of the trader's position size to copy (0–100)."),
|
|
29
|
+
maxCopyAmount: z
|
|
30
|
+
.number()
|
|
31
|
+
.positive()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Maximum USDC amount to copy per trade."),
|
|
34
|
+
notificationsEnabled: z
|
|
35
|
+
.boolean()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Whether to receive notifications for this trader's trades."),
|
|
38
|
+
}),
|
|
39
|
+
annotations: {
|
|
40
|
+
readOnlyHint: false,
|
|
41
|
+
openWorldHint: false,
|
|
42
|
+
},
|
|
43
|
+
}, async (params) => {
|
|
44
|
+
const data = await client.followTrader(params);
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
server.registerTool("get_trader", {
|
|
50
|
+
title: "Get Trader",
|
|
51
|
+
description: "Retrieve details about a specific trader you are following.",
|
|
52
|
+
inputSchema: z.object({
|
|
53
|
+
wallet: z
|
|
54
|
+
.string()
|
|
55
|
+
.describe("The Polymarket wallet address of the trader."),
|
|
56
|
+
}),
|
|
57
|
+
annotations: {
|
|
58
|
+
readOnlyHint: true,
|
|
59
|
+
openWorldHint: false,
|
|
60
|
+
},
|
|
61
|
+
}, async ({ wallet }) => {
|
|
62
|
+
const data = await client.getTrader(wallet);
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
server.registerTool("update_trader", {
|
|
68
|
+
title: "Update Trader",
|
|
69
|
+
description: "Update copy-trading settings for a trader you are following.",
|
|
70
|
+
inputSchema: z.object({
|
|
71
|
+
wallet: z
|
|
72
|
+
.string()
|
|
73
|
+
.describe("The Polymarket wallet address of the trader to update."),
|
|
74
|
+
copyPercentage: z
|
|
75
|
+
.number()
|
|
76
|
+
.min(0)
|
|
77
|
+
.max(100)
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("New copy percentage (0–100)."),
|
|
80
|
+
maxCopyAmount: z
|
|
81
|
+
.number()
|
|
82
|
+
.positive()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe("New maximum USDC amount per trade."),
|
|
85
|
+
notificationsEnabled: z
|
|
86
|
+
.boolean()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe("Whether to receive notifications for this trader's trades."),
|
|
89
|
+
copyTradingEnabled: z
|
|
90
|
+
.boolean()
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Whether copy-trading is enabled for this trader."),
|
|
93
|
+
}),
|
|
94
|
+
annotations: {
|
|
95
|
+
readOnlyHint: false,
|
|
96
|
+
idempotentHint: true,
|
|
97
|
+
openWorldHint: false,
|
|
98
|
+
},
|
|
99
|
+
}, async ({ wallet, ...body }) => {
|
|
100
|
+
const data = await client.updateTrader(wallet, body);
|
|
101
|
+
return {
|
|
102
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
server.registerTool("unfollow_trader", {
|
|
106
|
+
title: "Unfollow Trader",
|
|
107
|
+
description: "Stop copy-trading a trader and remove them from your follow list.",
|
|
108
|
+
inputSchema: z.object({
|
|
109
|
+
wallet: z
|
|
110
|
+
.string()
|
|
111
|
+
.describe("The Polymarket wallet address of the trader to unfollow."),
|
|
112
|
+
}),
|
|
113
|
+
annotations: {
|
|
114
|
+
readOnlyHint: false,
|
|
115
|
+
destructiveHint: true,
|
|
116
|
+
openWorldHint: false,
|
|
117
|
+
},
|
|
118
|
+
}, async ({ wallet }) => {
|
|
119
|
+
const data = await client.unfollowTrader(wallet);
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
server.registerTool("pause_trader", {
|
|
125
|
+
title: "Pause Trader",
|
|
126
|
+
description: "Pause copy-trading for a specific trader without unfollowing them.",
|
|
127
|
+
inputSchema: z.object({
|
|
128
|
+
wallet: z
|
|
129
|
+
.string()
|
|
130
|
+
.describe("The Polymarket wallet address of the trader to pause."),
|
|
131
|
+
}),
|
|
132
|
+
annotations: {
|
|
133
|
+
readOnlyHint: false,
|
|
134
|
+
idempotentHint: true,
|
|
135
|
+
openWorldHint: false,
|
|
136
|
+
},
|
|
137
|
+
}, async ({ wallet }) => {
|
|
138
|
+
const data = await client.pauseTrader(wallet);
|
|
139
|
+
return {
|
|
140
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
server.registerTool("resume_trader", {
|
|
144
|
+
title: "Resume Trader",
|
|
145
|
+
description: "Resume copy-trading for a previously paused trader.",
|
|
146
|
+
inputSchema: z.object({
|
|
147
|
+
wallet: z
|
|
148
|
+
.string()
|
|
149
|
+
.describe("The Polymarket wallet address of the trader to resume."),
|
|
150
|
+
}),
|
|
151
|
+
annotations: {
|
|
152
|
+
readOnlyHint: false,
|
|
153
|
+
idempotentHint: true,
|
|
154
|
+
openWorldHint: false,
|
|
155
|
+
},
|
|
156
|
+
}, async ({ wallet }) => {
|
|
157
|
+
const data = await client.resumeTrader(wallet);
|
|
158
|
+
return {
|
|
159
|
+
content: [{ type: "text", text: JSON.stringify(data ?? { success: true }, null, 2) }],
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=traders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traders.js","sourceRoot":"","sources":["../../src/tools/traders.ts"],"names":[],"mappings":"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"}
|