graph-polymarket-mcp 1.0.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/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # graph-polymarket-mcp
2
+
3
+ MCP server for querying [Polymarket](https://polymarket.com/) prediction market data via [The Graph](https://thegraph.com/) subgraphs.
4
+
5
+ Exposes 9 tools that AI agents (Claude, Cursor, etc.) can use to query market data, trader P&L, positions, activity, and orderbook trades.
6
+
7
+ ## Prerequisites
8
+
9
+ You need a Graph API key. Get one at: https://thegraph.com/studio/apikeys/
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install -g graph-polymarket-mcp
15
+ ```
16
+
17
+ Or use directly with npx:
18
+
19
+ ```bash
20
+ npx graph-polymarket-mcp
21
+ ```
22
+
23
+ ## Configuration
24
+
25
+ ### Claude Desktop
26
+
27
+ Add to your `claude_desktop_config.json`:
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "graph-polymarket": {
33
+ "command": "npx",
34
+ "args": ["-y", "graph-polymarket-mcp"],
35
+ "env": {
36
+ "GRAPH_API_KEY": "your-api-key-here"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ### Claude Code
44
+
45
+ ```bash
46
+ claude mcp add graph-polymarket -- npx -y graph-polymarket-mcp
47
+ ```
48
+
49
+ Set the environment variable `GRAPH_API_KEY` before running.
50
+
51
+ ### Cursor / Other MCP Clients
52
+
53
+ Use the stdio transport with `npx graph-polymarket-mcp` as the command, passing `GRAPH_API_KEY` as an environment variable.
54
+
55
+ ## Available Tools
56
+
57
+ ### Core Tools
58
+
59
+ | Tool | Description |
60
+ |------|-------------|
61
+ | `list_subgraphs` | List all available Polymarket subgraphs with descriptions and key entities |
62
+ | `get_subgraph_schema` | Get the full GraphQL schema for a specific subgraph |
63
+ | `query_subgraph` | Execute a custom GraphQL query against any subgraph |
64
+
65
+ ### Domain-Specific Tools
66
+
67
+ | Tool | Description | Subgraph |
68
+ |------|-------------|----------|
69
+ | `get_market_data` | Get market/condition data with outcomes and volumes | Main |
70
+ | `get_account_pnl` | Get a trader's P&L and performance metrics | Beefy P&L |
71
+ | `get_user_positions` | Get a user's current positions | Slimmed P&L |
72
+ | `get_recent_activity` | Get recent splits, merges, and redemptions | Activity |
73
+ | `get_orderbook_trades` | Get recent order fills | Orderbook |
74
+ | `get_global_stats` | Get aggregate platform statistics | Main |
75
+
76
+ ## Subgraphs
77
+
78
+ | Name | IPFS Hash | Description |
79
+ |------|-----------|-------------|
80
+ | Main | `QmdyCguLEisTtQFveEkvMhTH7UzjyhnrF9kpvhYeG4QX8a` | Complete ecosystem data |
81
+ | Beefy P&L | `QmbHwcGkumWdyTK2jYWXV3vX4WyinftEGbuwi7hDkhPWqG` | Comprehensive P&L tracking |
82
+ | Slimmed P&L | `QmZAYiMeZiWC7ZjdWepek7hy1jbcW3ngimBF9ibTiTtwQU` | Minimal position data |
83
+ | Activity | `Qmf3qPUsfQ8et6E3QNBmuXXKqUJi91mo5zbsaTkQrSnMAP` | Position management events |
84
+ | Orderbook | `QmVGA9vvNZtEquVzDpw8wnTFDxVjB6mavTRMTrKuUBhi4t` | Order fill analytics |
85
+
86
+ ## Example Queries
87
+
88
+ Once connected, an AI agent can:
89
+
90
+ - "What are the current Polymarket global stats?"
91
+ - "Show me the latest 20 orderbook trades"
92
+ - "What are the positions for address 0x...?"
93
+ - "Get the P&L for trader 0x...?"
94
+ - "Query the main subgraph for all conditions with more than 100 trades"
95
+
96
+ ## Development
97
+
98
+ ```bash
99
+ git clone https://github.com/your-username/graph-polymarket-mcp.git
100
+ cd graph-polymarket-mcp
101
+ npm install
102
+ npm run build
103
+ GRAPH_API_KEY=your-key node build/index.js
104
+ ```
105
+
106
+ ## License
107
+
108
+ MIT
@@ -0,0 +1,7 @@
1
+ export declare class GraphClientError extends Error {
2
+ readonly statusCode?: number | undefined;
3
+ readonly graphErrors?: unknown[] | undefined;
4
+ constructor(message: string, statusCode?: number | undefined, graphErrors?: unknown[] | undefined);
5
+ }
6
+ export declare function querySubgraph(ipfsHash: string, query: string, variables?: Record<string, unknown>): Promise<unknown>;
7
+ //# sourceMappingURL=graphClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphClient.d.ts","sourceRoot":"","sources":["../src/graphClient.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,UAAU,CAAC,EAAE,MAAM;aACnB,WAAW,CAAC,EAAE,OAAO,EAAE;gBAFvC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,WAAW,CAAC,EAAE,OAAO,EAAE,YAAA;CAK1C;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC,CA2ClB"}
@@ -0,0 +1,36 @@
1
+ export class GraphClientError extends Error {
2
+ statusCode;
3
+ graphErrors;
4
+ constructor(message, statusCode, graphErrors) {
5
+ super(message);
6
+ this.statusCode = statusCode;
7
+ this.graphErrors = graphErrors;
8
+ this.name = "GraphClientError";
9
+ }
10
+ }
11
+ export async function querySubgraph(ipfsHash, query, variables) {
12
+ const apiKey = process.env.GRAPH_API_KEY;
13
+ if (!apiKey) {
14
+ throw new GraphClientError("GRAPH_API_KEY environment variable is required. " +
15
+ "Get one at https://thegraph.com/studio/apikeys/");
16
+ }
17
+ const url = `https://gateway.thegraph.com/api/${apiKey}/subgraphs/id/${ipfsHash}`;
18
+ const body = { query };
19
+ if (variables && Object.keys(variables).length > 0) {
20
+ body.variables = variables;
21
+ }
22
+ const response = await fetch(url, {
23
+ method: "POST",
24
+ headers: { "Content-Type": "application/json" },
25
+ body: JSON.stringify(body),
26
+ });
27
+ if (!response.ok) {
28
+ throw new GraphClientError(`Graph API returned HTTP ${response.status}: ${response.statusText}`, response.status);
29
+ }
30
+ const json = (await response.json());
31
+ if (json.errors && json.errors.length > 0) {
32
+ throw new GraphClientError(`GraphQL errors: ${JSON.stringify(json.errors)}`, undefined, json.errors);
33
+ }
34
+ return json.data;
35
+ }
36
+ //# sourceMappingURL=graphClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphClient.js","sourceRoot":"","sources":["../src/graphClient.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGvB;IACA;IAHlB,YACE,OAAe,EACC,UAAmB,EACnB,WAAuB;QAEvC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAS;QACnB,gBAAW,GAAX,WAAW,CAAY;QAGvC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,KAAa,EACb,SAAmC;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,gBAAgB,CACxB,kDAAkD;YAChD,iDAAiD,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,oCAAoC,MAAM,iBAAiB,QAAQ,EAAE,CAAC;IAElF,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,CAAC;IAChD,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,gBAAgB,CACxB,2BAA2B,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EACpE,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,gBAAgB,CACxB,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAChD,SAAS,EACT,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,298 @@
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 { z } from "zod";
5
+ import { querySubgraph } from "./graphClient.js";
6
+ import { SUBGRAPHS, SUBGRAPH_NAMES } from "./subgraphs.js";
7
+ const server = new McpServer({
8
+ name: "graph-polymarket-mcp",
9
+ version: "1.0.0",
10
+ });
11
+ // Helper to format tool responses
12
+ function textResult(data) {
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
15
+ };
16
+ }
17
+ function errorResult(error) {
18
+ const message = error instanceof Error ? error.message : String(error);
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${message}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Tool 1: list_subgraphs
26
+ // ---------------------------------------------------------------------------
27
+ server.tool("list_subgraphs", "List all available Polymarket subgraphs with descriptions and key entities", {}, async () => {
28
+ const list = Object.entries(SUBGRAPHS).map(([key, cfg]) => ({
29
+ id: key,
30
+ name: cfg.name,
31
+ ipfsHash: cfg.ipfsHash,
32
+ description: cfg.description,
33
+ keyEntities: cfg.keyEntities,
34
+ }));
35
+ return textResult(list);
36
+ });
37
+ // ---------------------------------------------------------------------------
38
+ // Tool 2: get_subgraph_schema
39
+ // ---------------------------------------------------------------------------
40
+ server.tool("get_subgraph_schema", "Get the full GraphQL schema (introspection) for a Polymarket subgraph", {
41
+ subgraph: z
42
+ .enum(SUBGRAPH_NAMES)
43
+ .describe("Subgraph identifier: main, beefy_pnl, slimmed_pnl, activity, or orderbook"),
44
+ }, async ({ subgraph }) => {
45
+ try {
46
+ const cfg = SUBGRAPHS[subgraph];
47
+ const introspectionQuery = `{
48
+ __schema {
49
+ types {
50
+ name
51
+ kind
52
+ fields {
53
+ name
54
+ type { name kind ofType { name kind } }
55
+ }
56
+ }
57
+ }
58
+ }`;
59
+ const data = await querySubgraph(cfg.ipfsHash, introspectionQuery);
60
+ return textResult(data);
61
+ }
62
+ catch (error) {
63
+ return errorResult(error);
64
+ }
65
+ });
66
+ // ---------------------------------------------------------------------------
67
+ // Tool 3: query_subgraph
68
+ // ---------------------------------------------------------------------------
69
+ server.tool("query_subgraph", "Execute a custom GraphQL query against a Polymarket subgraph", {
70
+ subgraph: z
71
+ .enum(SUBGRAPH_NAMES)
72
+ .describe("Subgraph identifier: main, beefy_pnl, slimmed_pnl, activity, or orderbook"),
73
+ query: z.string().describe("GraphQL query string"),
74
+ variables: z
75
+ .record(z.unknown())
76
+ .optional()
77
+ .describe("Optional GraphQL variables as key-value pairs"),
78
+ }, async ({ subgraph, query, variables }) => {
79
+ try {
80
+ const cfg = SUBGRAPHS[subgraph];
81
+ const data = await querySubgraph(cfg.ipfsHash, query, variables);
82
+ return textResult(data);
83
+ }
84
+ catch (error) {
85
+ return errorResult(error);
86
+ }
87
+ });
88
+ // ---------------------------------------------------------------------------
89
+ // Tool 4: get_market_data
90
+ // ---------------------------------------------------------------------------
91
+ server.tool("get_market_data", "Get Polymarket market/condition data including outcomes and volumes from the Main subgraph", {
92
+ first: z.number().min(1).max(100).default(10).describe("Number of markets to return (1-100)"),
93
+ orderBy: z.string().default("id").describe("Field to order by"),
94
+ orderDirection: z.enum(["asc", "desc"]).default("desc").describe("Sort direction"),
95
+ }, async ({ first, orderBy, orderDirection }) => {
96
+ try {
97
+ const query = `{
98
+ conditions(first: ${first}, orderBy: ${orderBy}, orderDirection: ${orderDirection}) {
99
+ id
100
+ oracle
101
+ questionId
102
+ outcomeSlotCount
103
+ resolutionTimestamp
104
+ payoutNumerators
105
+ payoutDenominator
106
+ }
107
+ }`;
108
+ const data = await querySubgraph(SUBGRAPHS.main.ipfsHash, query);
109
+ return textResult(data);
110
+ }
111
+ catch (error) {
112
+ return errorResult(error);
113
+ }
114
+ });
115
+ // ---------------------------------------------------------------------------
116
+ // Tool 5: get_account_pnl
117
+ // ---------------------------------------------------------------------------
118
+ server.tool("get_account_pnl", "Get a trader's P&L and performance metrics from the Beefy P&L subgraph", {
119
+ account: z
120
+ .string()
121
+ .describe("Ethereum address of the trader (lowercase)"),
122
+ }, async ({ account }) => {
123
+ try {
124
+ const query = `{
125
+ account(id: "${account.toLowerCase()}") {
126
+ id
127
+ totalTrades
128
+ totalBuyAmount
129
+ totalSellAmount
130
+ totalFees
131
+ totalProfit
132
+ realizedProfit
133
+ unrealizedProfit
134
+ winRate
135
+ profitFactor
136
+ maxDrawdown
137
+ positions {
138
+ id
139
+ market { id }
140
+ realizedPnl
141
+ unrealizedPnl
142
+ netQuantity
143
+ }
144
+ }
145
+ }`;
146
+ const data = await querySubgraph(SUBGRAPHS.beefy_pnl.ipfsHash, query);
147
+ return textResult(data);
148
+ }
149
+ catch (error) {
150
+ return errorResult(error);
151
+ }
152
+ });
153
+ // ---------------------------------------------------------------------------
154
+ // Tool 6: get_user_positions
155
+ // ---------------------------------------------------------------------------
156
+ server.tool("get_user_positions", "Get a user's current positions from the Slimmed P&L subgraph", {
157
+ account: z
158
+ .string()
159
+ .describe("Ethereum address of the user (lowercase)"),
160
+ }, async ({ account }) => {
161
+ try {
162
+ const query = `{
163
+ userPositions(where: { user: "${account.toLowerCase()}" }, first: 100) {
164
+ id
165
+ user
166
+ tokenId
167
+ buyAmount
168
+ sellAmount
169
+ realizedPnl
170
+ netQuantity
171
+ }
172
+ }`;
173
+ const data = await querySubgraph(SUBGRAPHS.slimmed_pnl.ipfsHash, query);
174
+ return textResult(data);
175
+ }
176
+ catch (error) {
177
+ return errorResult(error);
178
+ }
179
+ });
180
+ // ---------------------------------------------------------------------------
181
+ // Tool 7: get_recent_activity
182
+ // ---------------------------------------------------------------------------
183
+ server.tool("get_recent_activity", "Get recent splits, merges, and redemptions from the Activity subgraph", {
184
+ first: z.number().min(1).max(100).default(20).describe("Number of events to return"),
185
+ account: z
186
+ .string()
187
+ .optional()
188
+ .describe("Optional: filter by Ethereum address"),
189
+ }, async ({ first, account }) => {
190
+ try {
191
+ const stakeholderWhere = account
192
+ ? `, where: { stakeholder: "${account.toLowerCase()}" }`
193
+ : "";
194
+ const redeemerWhere = account
195
+ ? `, where: { redeemer: "${account.toLowerCase()}" }`
196
+ : "";
197
+ const query = `{
198
+ splits(first: ${first}, orderBy: timestamp, orderDirection: desc${stakeholderWhere}) {
199
+ id
200
+ stakeholder
201
+ amount
202
+ timestamp
203
+ }
204
+ merges(first: ${first}, orderBy: timestamp, orderDirection: desc${stakeholderWhere}) {
205
+ id
206
+ stakeholder
207
+ amount
208
+ timestamp
209
+ }
210
+ redemptions(first: ${first}, orderBy: timestamp, orderDirection: desc${redeemerWhere}) {
211
+ id
212
+ redeemer
213
+ amount
214
+ timestamp
215
+ }
216
+ }`;
217
+ const data = await querySubgraph(SUBGRAPHS.activity.ipfsHash, query);
218
+ return textResult(data);
219
+ }
220
+ catch (error) {
221
+ return errorResult(error);
222
+ }
223
+ });
224
+ // ---------------------------------------------------------------------------
225
+ // Tool 8: get_orderbook_trades
226
+ // ---------------------------------------------------------------------------
227
+ server.tool("get_orderbook_trades", "Get recent order fills from the Orderbook subgraph", {
228
+ first: z.number().min(1).max(100).default(20).describe("Number of trades to return"),
229
+ maker: z.string().optional().describe("Optional: filter by maker address"),
230
+ taker: z.string().optional().describe("Optional: filter by taker address"),
231
+ }, async ({ first, maker, taker }) => {
232
+ try {
233
+ const filters = [];
234
+ if (maker)
235
+ filters.push(`maker: "${maker.toLowerCase()}"`);
236
+ if (taker)
237
+ filters.push(`taker: "${taker.toLowerCase()}"`);
238
+ const where = filters.length > 0 ? `, where: { ${filters.join(", ")} }` : "";
239
+ const query = `{
240
+ orderFilledEvents(first: ${first}, orderBy: timestamp, orderDirection: desc${where}) {
241
+ id
242
+ maker
243
+ taker
244
+ makerAssetId
245
+ takerAssetId
246
+ makerAmountFilled
247
+ takerAmountFilled
248
+ fee
249
+ price
250
+ side
251
+ timestamp
252
+ }
253
+ }`;
254
+ const data = await querySubgraph(SUBGRAPHS.orderbook.ipfsHash, query);
255
+ return textResult(data);
256
+ }
257
+ catch (error) {
258
+ return errorResult(error);
259
+ }
260
+ });
261
+ // ---------------------------------------------------------------------------
262
+ // Tool 9: get_global_stats
263
+ // ---------------------------------------------------------------------------
264
+ server.tool("get_global_stats", "Get aggregate Polymarket platform statistics from the Main subgraph", {}, async () => {
265
+ try {
266
+ const query = `{
267
+ globals {
268
+ id
269
+ numConditions
270
+ numOpenConditions
271
+ numClosedConditions
272
+ numTraders
273
+ numTrades
274
+ tradeVolume
275
+ scaledTradeVolume
276
+ totalFees
277
+ }
278
+ }`;
279
+ const data = await querySubgraph(SUBGRAPHS.main.ipfsHash, query);
280
+ return textResult(data);
281
+ }
282
+ catch (error) {
283
+ return errorResult(error);
284
+ }
285
+ });
286
+ // ---------------------------------------------------------------------------
287
+ // Start server
288
+ // ---------------------------------------------------------------------------
289
+ async function main() {
290
+ const transport = new StdioServerTransport();
291
+ await server.connect(transport);
292
+ console.error("Graph Polymarket MCP server running on stdio");
293
+ }
294
+ main().catch((error) => {
295
+ console.error("Fatal error:", error);
296
+ process.exit(1);
297
+ });
298
+ //# 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,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,kCAAkC;AAClC,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4EAA4E,EAC5E,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC,CAAC,CAAC;IACJ,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uEAAuE,EACvE;IACE,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,cAAc,CAAC;SACpB,QAAQ,CAAC,2EAA2E,CAAC;CACzF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,kBAAkB,GAAG;;;;;;;;;;;QAWzB,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACnE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8DAA8D,EAC9D;IACE,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,cAAc,CAAC;SACpB,QAAQ,CAAC,2EAA2E,CAAC;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAClD,SAAS,EAAE,CAAC;SACT,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;CAC7D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4FAA4F,EAC5F;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC/D,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CACnF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG;4BACQ,KAAK,cAAc,OAAO,qBAAqB,cAAc;;;;;;;;;QASjF,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wEAAwE,EACxE;IACE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG;uBACG,OAAO,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;QAoBpC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,8DAA8D,EAC9D;IACE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,0CAA0C,CAAC;CACxD,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG;wCACoB,OAAO,CAAC,WAAW,EAAE;;;;;;;;;QASrD,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uEAAuE,EACvE;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACpF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;CACpD,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IAC3B,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,OAAO;YAC9B,CAAC,CAAC,4BAA4B,OAAO,CAAC,WAAW,EAAE,KAAK;YACxD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,aAAa,GAAG,OAAO;YAC3B,CAAC,CAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,KAAK;YACrD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG;wBACI,KAAK,6CAA6C,gBAAgB;;;;;;wBAMlE,KAAK,6CAA6C,gBAAgB;;;;;;6BAM7D,KAAK,6CAA6C,aAAa;;;;;;QAMpF,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,oDAAoD,EACpD;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7E,MAAM,KAAK,GAAG;mCACe,KAAK,6CAA6C,KAAK;;;;;;;;;;;;;QAalF,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qEAAqE,EACrE,EAAE,EACF,KAAK,IAAI,EAAE;IACT,IAAI,CAAC;QACH,MAAM,KAAK,GAAG;;;;;;;;;;;;QAYZ,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAC9E,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AAChE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface SubgraphConfig {
2
+ name: string;
3
+ ipfsHash: string;
4
+ description: string;
5
+ keyEntities: string[];
6
+ }
7
+ export declare const SUBGRAPHS: Record<string, SubgraphConfig>;
8
+ export declare const SUBGRAPH_NAMES: [string, ...string[]];
9
+ //# sourceMappingURL=subgraphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraphs.d.ts","sourceRoot":"","sources":["../src/subgraphs.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAoEpD,CAAC;AAEF,eAAO,MAAM,cAAc,EAA6B,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ export const SUBGRAPHS = {
2
+ main: {
3
+ name: "Main",
4
+ ipfsHash: "QmdyCguLEisTtQFveEkvMhTH7UzjyhnrF9kpvhYeG4QX8a",
5
+ description: "Complete Polymarket ecosystem data including markets, conditions, FPMMs, trading, and liquidity provision.",
6
+ keyEntities: [
7
+ "Global",
8
+ "Account",
9
+ "Condition",
10
+ "FixedProductMarketMaker",
11
+ "MarketData",
12
+ "MarketPosition",
13
+ "Transaction",
14
+ "OrderFilledEvent",
15
+ ],
16
+ },
17
+ beefy_pnl: {
18
+ name: "Beefy Profit and Loss",
19
+ ipfsHash: "QmbHwcGkumWdyTK2jYWXV3vX4WyinftEGbuwi7hDkhPWqG",
20
+ description: "Comprehensive P&L tracking with performance analytics including win rate, profit factor, max drawdown, and daily stats.",
21
+ keyEntities: [
22
+ "Global",
23
+ "Account",
24
+ "Condition",
25
+ "Market",
26
+ "MarketPosition",
27
+ "MarketProfit",
28
+ "Transaction",
29
+ "DailyStats",
30
+ ],
31
+ },
32
+ slimmed_pnl: {
33
+ name: "Slimmed P&L",
34
+ ipfsHash: "QmZAYiMeZiWC7ZjdWepek7hy1jbcW3ngimBF9ibTiTtwQU",
35
+ description: "Minimal schema focused on essential user position data with buy/sell amounts and realized P&L.",
36
+ keyEntities: ["UserPosition", "NegRiskEvent", "Condition", "FPMM"],
37
+ },
38
+ activity: {
39
+ name: "Activity",
40
+ ipfsHash: "Qmf3qPUsfQ8et6E3QNBmuXXKqUJi91mo5zbsaTkQrSnMAP",
41
+ description: "Lightweight activity and event logging for position management operations (splits, merges, redemptions).",
42
+ keyEntities: [
43
+ "Split",
44
+ "Merge",
45
+ "Redemption",
46
+ "NegRiskConversion",
47
+ "NegRiskEvent",
48
+ "Condition",
49
+ ],
50
+ },
51
+ orderbook: {
52
+ name: "Orderbook",
53
+ ipfsHash: "QmVGA9vvNZtEquVzDpw8wnTFDxVjB6mavTRMTrKuUBhi4t",
54
+ description: "Orderbook-specific trading data with enhanced analytics, order fills, and per-market/per-account statistics.",
55
+ keyEntities: [
56
+ "Global",
57
+ "Account",
58
+ "MarketData",
59
+ "OrderFilledEvent",
60
+ "OrdersMatchedEvent",
61
+ "Orderbook",
62
+ ],
63
+ },
64
+ };
65
+ export const SUBGRAPH_NAMES = Object.keys(SUBGRAPHS);
66
+ //# sourceMappingURL=subgraphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraphs.js","sourceRoot":"","sources":["../src/subgraphs.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,SAAS,GAAmC;IACvD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,gDAAgD;QAC1D,WAAW,EACT,4GAA4G;QAC9G,WAAW,EAAE;YACX,QAAQ;YACR,SAAS;YACT,WAAW;YACX,yBAAyB;YACzB,YAAY;YACZ,gBAAgB;YAChB,aAAa;YACb,kBAAkB;SACnB;KACF;IACD,SAAS,EAAE;QACT,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,gDAAgD;QAC1D,WAAW,EACT,yHAAyH;QAC3H,WAAW,EAAE;YACX,QAAQ;YACR,SAAS;YACT,WAAW;YACX,QAAQ;YACR,gBAAgB;YAChB,cAAc;YACd,aAAa;YACb,YAAY;SACb;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,gDAAgD;QAC1D,WAAW,EACT,gGAAgG;QAClG,WAAW,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC;KACnE;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,gDAAgD;QAC1D,WAAW,EACT,0GAA0G;QAC5G,WAAW,EAAE;YACX,OAAO;YACP,OAAO;YACP,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,WAAW;SACZ;KACF;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,gDAAgD;QAC1D,WAAW,EACT,8GAA8G;QAChH,WAAW,EAAE;YACX,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,kBAAkB;YAClB,oBAAoB;YACpB,WAAW;SACZ;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAA0B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "graph-polymarket-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for querying Polymarket data via The Graph subgraphs",
5
+ "type": "module",
6
+ "bin": {
7
+ "graph-polymarket-mcp": "build/index.js"
8
+ },
9
+ "main": "./build/index.js",
10
+ "scripts": {
11
+ "build": "tsc && chmod 755 build/index.js",
12
+ "start": "node build/index.js",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "files": [
16
+ "build"
17
+ ],
18
+ "keywords": [
19
+ "mcp",
20
+ "polymarket",
21
+ "thegraph",
22
+ "subgraph",
23
+ "prediction-market",
24
+ "ai",
25
+ "claude"
26
+ ],
27
+ "author": "",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.12.1",
31
+ "zod": "^3.24.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^22.0.0",
35
+ "typescript": "^5.7.0"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ }
40
+ }