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 +108 -0
- package/build/graphClient.d.ts +7 -0
- package/build/graphClient.d.ts.map +1 -0
- package/build/graphClient.js +36 -0
- package/build/graphClient.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +298 -0
- package/build/index.js.map +1 -0
- package/build/subgraphs.d.ts +9 -0
- package/build/subgraphs.d.ts.map +1 -0
- package/build/subgraphs.js +66 -0
- package/build/subgraphs.js.map +1 -0
- package/package.json +40 -0
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"}
|
package/build/index.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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
|
+
}
|