subgraph-registry-mcp 0.9.2 → 0.9.4

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 CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Agent-friendly semantic classification of all subgraphs on [The Graph Network](https://thegraph.com).
8
8
 
9
- Pre-computed index of **14,700+ subgraphs** with domain classification, protocol type detection, schema fingerprinting, canonical entity mapping, and composite reliability scoring.
9
+ Pre-computed index of **15,330 subgraphs** with domain classification, protocol type detection, schema fingerprinting, canonical entity mapping, and composite reliability scoring.
10
10
 
11
11
  > **What's new in 0.8.0** — three agent-discovery upgrades:
12
12
  > - **[Semantic search](#semantic-search)** via 384-dim embeddings (`semantic_search_subgraphs`)
@@ -100,14 +100,15 @@ Explore subgraphs by use case — each file lists the top 25 subgraphs ranked by
100
100
 
101
101
  | Domain | Count | File |
102
102
  |--------|-------|------|
103
- | [DeFi](docs/domains/defi.md) | 11,218 | Swaps, pools, lending, vaults, yield |
104
- | [NFTs](docs/domains/nfts.md) | 857 | Collections, marketplaces, sales |
105
- | [Infrastructure](docs/domains/infrastructure.md) | 581 | Indexers, oracles, registries |
106
- | [DAO](docs/domains/dao.md) | 429 | Governance, proposals, voting |
107
- | [Identity](docs/domains/identity.md) | 401 | ENS, name services, resolvers |
108
- | [Analytics](docs/domains/analytics.md) | 327 | Snapshots, metrics, historical data |
109
- | [Gaming](docs/domains/gaming.md) | 247 | Players, quests, items, worlds |
110
- | [Social](docs/domains/social.md) | 74 | Profiles, posts, follows |
103
+ | [DeFi](docs/domains/defi.md) | 7,844 | Swaps, pools, lending, vaults, yield |
104
+ | [NFTs](docs/domains/nfts.md) | 1,565 | Collections, marketplaces, sales |
105
+ | Unclassified | 1,333 | Not confidently classified |
106
+ | [Infrastructure](docs/domains/infrastructure.md) | 1,251 | Indexers, oracles, registries |
107
+ | [Identity](docs/domains/identity.md) | 1,061 | ENS, name services, resolvers |
108
+ | [Analytics](docs/domains/analytics.md) | 766 | Snapshots, metrics, historical data |
109
+ | [DAO](docs/domains/dao.md) | 758 | Governance, proposals, voting |
110
+ | [Gaming](docs/domains/gaming.md) | 585 | Players, quests, items, worlds |
111
+ | [Social](docs/domains/social.md) | 167 | Profiles, posts, follows |
111
112
 
112
113
  Full index: [`docs/DOMAINS.md`](docs/DOMAINS.md)
113
114
 
@@ -117,13 +118,13 @@ Explore subgraphs by blockchain — each file lists the top 25 subgraphs on that
117
118
 
118
119
  | Network | Count | File |
119
120
  |---------|-------|------|
120
- | [Ethereum](docs/networks/mainnet.md) | 2,377 | Largest ecosystem |
121
- | [Base](docs/networks/base.md) | 1,728 | Fast-growing L2 |
122
- | [BSC](docs/networks/bsc.md) | 1,582 | BNB Chain |
123
- | [Arbitrum](docs/networks/arbitrum-one.md) | 1,376 | Leading L2 |
124
- | [Polygon](docs/networks/matic.md) | 1,266 | Polygon PoS |
125
- | [Optimism](docs/networks/optimism.md) | 568 | OP Stack L2 |
126
- | [Avalanche](docs/networks/avalanche.md) | 440 | C-Chain |
121
+ | [Ethereum](docs/networks/mainnet.md) | 2,484 | Largest ecosystem |
122
+ | [Base](docs/networks/base.md) | 1,841 | Fast-growing L2 |
123
+ | [BSC](docs/networks/bsc.md) | 1,670 | BNB Chain |
124
+ | [Arbitrum](docs/networks/arbitrum-one.md) | 1,437 | Leading L2 |
125
+ | [Polygon](docs/networks/matic.md) | 1,304 | Polygon PoS |
126
+ | [Optimism](docs/networks/optimism.md) | 580 | OP Stack L2 |
127
+ | [Avalanche](docs/networks/avalanche.md) | 453 | C-Chain |
127
128
 
128
129
  Full index: [`docs/NETWORKS.md`](docs/NETWORKS.md)
129
130
 
@@ -131,16 +132,16 @@ Full index: [`docs/NETWORKS.md`](docs/NETWORKS.md)
131
132
 
132
133
  | Type | Count | Description |
133
134
  |------|-------|-------------|
134
- | DEX | 4,176 | Uniswap, Sushi, Curve, Balancer, PancakeSwap |
135
- | Lending | 1,424 | Aave, Compound, Morpho, Spark, Silo |
136
- | Staking | 867 | Lido, Rocket Pool, EigenLayer, Graph Network |
137
- | Bridge | 771 | Hop, Stargate, Across, Wormhole, LayerZero |
138
- | NFT Marketplace | 436 | OpenSea, Blur, Rarible, Foundation |
139
- | Governance | 416 | Snapshot, Tally, Compound Governor |
140
- | Yield Aggregator | 387 | Yearn, Beefy, Harvest, Convex |
141
- | Perpetuals | 266 | GMX, Gains, dYdX, Hyperliquid |
142
- | Name Service | 223 | ENS, Space ID, Unstoppable Domains |
143
- | Options | 179 | Premia, Dopex, Lyra, Hegic |
135
+ | DEX | 4,411 | Uniswap, Sushi, Curve, Balancer, PancakeSwap |
136
+ | Lending | 1,469 | Aave, Compound, Morpho, Spark, Silo |
137
+ | Staking | 898 | Lido, Rocket Pool, EigenLayer, Graph Network |
138
+ | Bridge | 836 | Hop, Stargate, Across, Wormhole, LayerZero |
139
+ | NFT Marketplace | 450 | OpenSea, Blur, Rarible, Foundation |
140
+ | Yield Aggregator | 425 | Yearn, Beefy, Harvest, Convex |
141
+ | Governance | 425 | Snapshot, Tally, Compound Governor |
142
+ | Perpetuals | 273 | GMX, Gains, dYdX, Hyperliquid |
143
+ | Name Service | 227 | ENS, Space ID, Unstoppable Domains |
144
+ | Options | 192 | Premia, Dopex, Lyra, Hegic |
144
145
 
145
146
  ---
146
147
 
package/data/openapi.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "info": {
4
4
  "title": "Subgraph Registry",
5
5
  "description": "Agent-friendly subgraph discovery on The Graph Network. 14,700+ classified subgraphs with semantic search, reliability scoring, schema-evolution tracking, and x402 query URLs ($0.01 USDC on Base, no API key).",
6
- "version": "0.8.31",
6
+ "version": "0.9.4",
7
7
  "license": {
8
8
  "name": "MIT"
9
9
  },
@@ -22,8 +22,8 @@
22
22
  "/mcp/tools/search_subgraphs": {
23
23
  "post": {
24
24
  "operationId": "tool_search_subgraphs",
25
- "summary": "Search and filter the classified subgraph registry (15,500+ subgraphs).",
26
- "description": "Search and filter the classified subgraph registry (15,500+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required).",
25
+ "summary": "Search and filter the classified subgraph registry (15,000+ subgraphs).",
26
+ "description": "Search and filter the classified subgraph registry (15,000+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required), plus age_days and maturity (new | emerging | established). Because reliability_score is cumulative it structurally favours older deployments, so a separate `emerging` list carries recent matches that ranked below the main cut for age rather than quality — read `emerging_caveat` before offering one to a user.",
27
27
  "tags": [
28
28
  "mcp-tools"
29
29
  ],
@@ -57,12 +57,27 @@
57
57
  },
58
58
  "min_reliability": {
59
59
  "type": "number",
60
- "description": "Minimum reliability score (0-1). Higher = more query fees, volume, curation signal, and indexer allocation."
60
+ "description": "Minimum reliability score (0-1). Higher = more query fees, volume, curation signal, and indexer allocation. NOTE: all four inputs are cumulative, so this score rises with age — setting a floor here filters out good recent subgraphs along with bad ones."
61
61
  },
62
62
  "limit": {
63
63
  "type": "integer",
64
64
  "description": "Max results to return (default: 20)",
65
65
  "default": 20
66
+ },
67
+ "include_unserved": {
68
+ "type": "boolean",
69
+ "description": "Include subgraphs with 0 active indexer allocations (returns 'no allocations' on query). Default false.",
70
+ "default": false
71
+ },
72
+ "include_denied": {
73
+ "type": "boolean",
74
+ "description": "Include curation-denied deployments (deniedAt > 0 — denied indexing rewards, typically spam, duplicates or deprecations). Default false. When true, each result carries denied: true so the choice stays visible.",
75
+ "default": false
76
+ },
77
+ "include_testnets": {
78
+ "type": "boolean",
79
+ "description": "Include testnet deployments (sepolia, goerli, holesky, chapel, fuji, mumbai, amoy, *-testnet). Default false — a testnet twin's text is near-identical to its mainnet original, so it competes for the top slot without being the thing anyone wanted. Ignored when you explicitly request a testnet network, so network:\"sepolia\" still works. Each result carries testnet: true|false.",
80
+ "default": false
66
81
  }
67
82
  }
68
83
  }
@@ -282,6 +297,16 @@
282
297
  "description": "Include subgraphs with 0 active indexer allocations (returns 'no allocations' on query). Default false.",
283
298
  "default": false
284
299
  },
300
+ "include_denied": {
301
+ "type": "boolean",
302
+ "description": "Include curation-denied deployments (deniedAt > 0 — denied indexing rewards, typically spam, duplicates or deprecations). Default false. When true, each result carries denied: true so the choice stays visible.",
303
+ "default": false
304
+ },
305
+ "include_testnets": {
306
+ "type": "boolean",
307
+ "description": "Include testnet deployments (sepolia, goerli, holesky, chapel, fuji, mumbai, amoy, *-testnet). Default false — a testnet twin's text is near-identical to its mainnet original, so it competes for the top slot without being the thing anyone wanted. Ignored when you explicitly request a testnet network, so network:\"sepolia\" still works. Each result carries testnet: true|false.",
308
+ "default": false
309
+ },
285
310
  "domain": {
286
311
  "type": "string",
287
312
  "description": "Pre-filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics)"
@@ -433,6 +458,38 @@
433
458
  }
434
459
  }
435
460
  },
461
+ "/graphql": {
462
+ "post": {
463
+ "operationId": "rest_post_graphql",
464
+ "summary": "payql compatibility — search results in subgraphMetadataSearch shape",
465
+ "tags": [
466
+ "rest"
467
+ ],
468
+ "responses": {
469
+ "200": {
470
+ "description": "{ data: { subgraphMetadataSearch: [...] } }",
471
+ "content": {
472
+ "application/json": {
473
+ "schema": {
474
+ "type": "object",
475
+ "description": "{ data: { subgraphMetadataSearch: [...] } }"
476
+ }
477
+ }
478
+ }
479
+ },
480
+ "404": {
481
+ "description": "Not found",
482
+ "content": {
483
+ "application/json": {
484
+ "schema": {
485
+ "$ref": "#/components/schemas/ToolError"
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
491
+ }
492
+ },
436
493
  "/.well-known/subgraph/{id}.jsonld": {
437
494
  "get": {
438
495
  "operationId": "rest_get_well_known_subgraph_id_jsonld",
package/openapi.yaml CHANGED
@@ -5,7 +5,7 @@ openapi: "3.1.0"
5
5
  info:
6
6
  title: "Subgraph Registry"
7
7
  description: "Agent-friendly subgraph discovery on The Graph Network. 14,700+ classified subgraphs with semantic search, reliability scoring, schema-evolution tracking, and x402 query URLs ($0.01 USDC on Base, no API key)."
8
- version: "0.8.31"
8
+ version: "0.9.4"
9
9
  license:
10
10
  name: "MIT"
11
11
  contact:
@@ -18,8 +18,8 @@ paths:
18
18
  "/mcp/tools/search_subgraphs":
19
19
  post:
20
20
  operationId: "tool_search_subgraphs"
21
- summary: "Search and filter the classified subgraph registry (15,500+ subgraphs)."
22
- description: "Search and filter the classified subgraph registry (15,500+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required)."
21
+ summary: "Search and filter the classified subgraph registry (15,000+ subgraphs)."
22
+ description: "Search and filter the classified subgraph registry (15,000+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required), plus age_days and maturity (new | emerging | established). Because reliability_score is cumulative it structurally favours older deployments, so a separate `emerging` list carries recent matches that ranked below the main cut for age rather than quality — read `emerging_caveat` before offering one to a user."
23
23
  tags:
24
24
  - "mcp-tools"
25
25
  requestBody:
@@ -47,11 +47,23 @@ paths:
47
47
  description: "Filter by canonical entity: liquidity_pool, trade, token, position, vault, loan, etc."
48
48
  min_reliability:
49
49
  type: "number"
50
- description: "Minimum reliability score (0-1). Higher = more query fees, volume, curation signal, and indexer allocation."
50
+ description: "Minimum reliability score (0-1). Higher = more query fees, volume, curation signal, and indexer allocation. NOTE: all four inputs are cumulative, so this score rises with age — setting a floor here filters out good recent subgraphs along with bad ones."
51
51
  limit:
52
52
  type: "integer"
53
53
  description: "Max results to return (default: 20)"
54
54
  default: 20
55
+ include_unserved:
56
+ type: "boolean"
57
+ description: "Include subgraphs with 0 active indexer allocations (returns 'no allocations' on query). Default false."
58
+ default: false
59
+ include_denied:
60
+ type: "boolean"
61
+ description: "Include curation-denied deployments (deniedAt > 0 — denied indexing rewards, typically spam, duplicates or deprecations). Default false. When true, each result carries denied: true so the choice stays visible."
62
+ default: false
63
+ include_testnets:
64
+ type: "boolean"
65
+ description: "Include testnet deployments (sepolia, goerli, holesky, chapel, fuji, mumbai, amoy, *-testnet). Default false — a testnet twin's text is near-identical to its mainnet original, so it competes for the top slot without being the thing anyone wanted. Ignored when you explicitly request a testnet network, so network:\"sepolia\" still works. Each result carries testnet: true|false."
66
+ default: false
55
67
  responses:
56
68
  "200":
57
69
  description: "Tool result (JSON-encoded)"
@@ -194,6 +206,14 @@ paths:
194
206
  type: "boolean"
195
207
  description: "Include subgraphs with 0 active indexer allocations (returns 'no allocations' on query). Default false."
196
208
  default: false
209
+ include_denied:
210
+ type: "boolean"
211
+ description: "Include curation-denied deployments (deniedAt > 0 — denied indexing rewards, typically spam, duplicates or deprecations). Default false. When true, each result carries denied: true so the choice stays visible."
212
+ default: false
213
+ include_testnets:
214
+ type: "boolean"
215
+ description: "Include testnet deployments (sepolia, goerli, holesky, chapel, fuji, mumbai, amoy, *-testnet). Default false — a testnet twin's text is near-identical to its mainnet original, so it competes for the top slot without being the thing anyone wanted. Ignored when you explicitly request a testnet network, so network:\"sepolia\" still works. Each result carries testnet: true|false."
216
+ default: false
197
217
  domain:
198
218
  type: "string"
199
219
  description: "Pre-filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics)"
@@ -287,6 +307,26 @@ paths:
287
307
  application/json:
288
308
  schema:
289
309
  "$ref": "#/components/schemas/ToolError"
310
+ "/graphql":
311
+ post:
312
+ operationId: "rest_post_graphql"
313
+ summary: "payql compatibility — search results in subgraphMetadataSearch shape"
314
+ tags:
315
+ - "rest"
316
+ responses:
317
+ "200":
318
+ description: "{ data: { subgraphMetadataSearch: [...] } }"
319
+ content:
320
+ application/json:
321
+ schema:
322
+ type: "object"
323
+ description: "{ data: { subgraphMetadataSearch: [...] } }"
324
+ "404":
325
+ description: "Not found"
326
+ content:
327
+ application/json:
328
+ schema:
329
+ "$ref": "#/components/schemas/ToolError"
290
330
  "/.well-known/subgraph/{id}.jsonld":
291
331
  get:
292
332
  operationId: "rest_get_well_known_subgraph_id_jsonld"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "subgraph-registry-mcp",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "mcpName": "io.github.PaulieB14/subgraph-registry-mcp",
5
5
  "description": "MCP server for agent-friendly subgraph discovery on The Graph Network. 15,330 classified subgraphs with x402 query URLs ($0.01 USDC on Base, no API key required), reliability scoring, and protocol classification.",
6
6
  "type": "module",
@@ -18,7 +18,9 @@
18
18
  "start": "node src/index.js",
19
19
  "start:http": "node src/index.js --http",
20
20
  "start:http-only": "node src/index.js --http-only",
21
- "test": "node --test test/"
21
+ "test": "node --test test/",
22
+ "sync:server": "node scripts/sync-server-json.js",
23
+ "version": "node scripts/sync-server-json.js && node scripts/gen-openapi.js && git add server.json openapi.yaml data/openapi.json"
22
24
  },
23
25
  "keywords": [
24
26
  "mcp",
package/src/index.js CHANGED
@@ -1237,7 +1237,7 @@ const TOOLS = [
1237
1237
  {
1238
1238
  name: "search_subgraphs",
1239
1239
  description:
1240
- "Search and filter the classified subgraph registry (15,500+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required), plus age_days and maturity (new | emerging | established). Because reliability_score is cumulative it structurally favours older deployments, so a separate `emerging` list carries recent matches that ranked below the main cut for age rather than quality — read `emerging_caveat` before offering one to a user.",
1240
+ "Search and filter the classified subgraph registry (15,000+ subgraphs). Filter by domain (defi, nfts, dao, gaming, identity, infrastructure, social, analytics), network (mainnet, arbitrum-one, base, matic, bsc, optimism, avalanche), protocol_type (dex, lending, bridge, staking, options, perpetuals, nft-marketplace, yield-aggregator, governance, name-service), canonical entity type (liquidity_pool, trade, token, position, vault, loan, collateral, liquidation, nft_collection, nft_item, nft_sale, proposal, delegate, domain_name, account, transaction, daily_snapshot, hourly_snapshot), or free-text keyword. Returns subgraphs ranked by reliability score. Each result includes query_url_x402 (POST GraphQL and pay $0.01 USDC on Base per query — no API key needed) and a legacy query_url (Studio API key required), plus age_days and maturity (new | emerging | established). Because reliability_score is cumulative it structurally favours older deployments, so a separate `emerging` list carries recent matches that ranked below the main cut for age rather than quality — read `emerging_caveat` before offering one to a user.",
1241
1241
  inputSchema: {
1242
1242
  type: "object",
1243
1243
  additionalProperties: false,
@@ -1640,6 +1640,14 @@ export const REST_ROUTES = [
1640
1640
  required: ["status", "subgraphs"],
1641
1641
  },
1642
1642
  },
1643
+ {
1644
+ method: "post",
1645
+ path: "/graphql",
1646
+ summary: "payql compatibility — search results in subgraphMetadataSearch shape",
1647
+ description:
1648
+ "Answers a `subgraphMetadataSearch` query in The Graph network subgraph's shape, so payql (PAYQL_REGISTRY_URL) can use this registry as a free discovery source with no change on its side. Only the `text` and `first` variables are read; results come from the same index search_subgraphs uses.",
1649
+ response: { type: "object", description: "{ data: { subgraphMetadataSearch: [...] } }" },
1650
+ },
1643
1651
  {
1644
1652
  method: "get",
1645
1653
  path: "/.well-known/subgraph/{id}.jsonld",