solana-nft-mcp 1.17.2 → 1.18.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 +3 -0
- package/data/candy-collections.json +18 -3
- package/data/issuers.json +3 -3
- package/dist/identify.js +11 -4
- package/dist/index.js +284 -55
- package/dist/lib/coreplugins.js +57 -10
- package/dist/lib/errors.js +11 -0
- package/dist/lib/http.js +24 -1
- package/dist/lib/secrets.js +52 -1
- package/dist/lib/untrusted.js +34 -0
- package/dist/lib/version.js +11 -0
- package/dist/mechanics.js +4 -4
- package/dist/recipes.js +54 -14
- package/dist/sources/catalog.js +7 -3
- package/dist/sources/das.js +4 -3
- package/dist/sources/magiceden.js +141 -27
- package/dist/sources/opensea.js +125 -21
- package/dist/sources/solana.js +41 -6
- package/package.json +11 -5
package/README.md
CHANGED
|
@@ -77,6 +77,9 @@ onto Settings -> Extensions.
|
|
|
77
77
|
Cursor, Windsurf, Gemini CLI, Zed, Cline and VS Code take the same `command` / `args` pair in
|
|
78
78
|
their own config; the server is plain stdio with no client-specific code, but those have not
|
|
79
79
|
been tested here. ChatGPT on the web and Grok cannot run a local process.
|
|
80
|
+
The server speaks MCP protocol revision 2025-11-25 through the official TypeScript SDK v1. A
|
|
81
|
+
client that offers the newer 2026-07-28 revision gets 2025-11-25 back, which current clients
|
|
82
|
+
accept; one that refuses anything older cannot use this server yet.
|
|
80
83
|
|
|
81
84
|
**Did it work?** Your app lists the tools near the message box (Claude Code: `/mcp`). You should
|
|
82
85
|
see 21, starting with `identify`. If none: the path must be absolute and end in `dist/index.js`,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CandyScan tracker (p1xel.app/candymigration), reconciled against the chain daily",
|
|
3
|
-
"takenAt": "2026-
|
|
4
|
-
"count":
|
|
3
|
+
"takenAt": "2026-10-08",
|
|
4
|
+
"count": 401,
|
|
5
5
|
"categories": {
|
|
6
|
-
"MLB":
|
|
6
|
+
"MLB": 103,
|
|
7
7
|
"Other": 26,
|
|
8
8
|
"DC": 272
|
|
9
9
|
},
|
|
@@ -513,6 +513,11 @@
|
|
|
513
513
|
"name": "2025 MLB Tokyo Series ICONs",
|
|
514
514
|
"category": "MLB"
|
|
515
515
|
},
|
|
516
|
+
{
|
|
517
|
+
"address": "YTAPbbkLY6cqskMCtBfQXtN1x1a8smiKiM99svzQAvX",
|
|
518
|
+
"name": "2026 MLB All-Star Game ICONs",
|
|
519
|
+
"category": "MLB"
|
|
520
|
+
},
|
|
516
521
|
{
|
|
517
522
|
"address": "68RmmVKLMSNoh6vJdfTvkQBabg4m4zfCNfDP8W9nhekg",
|
|
518
523
|
"name": "2026 MLB Base Icons - Prototype 2",
|
|
@@ -818,6 +823,16 @@
|
|
|
818
823
|
"name": "Bank of America",
|
|
819
824
|
"category": "Other"
|
|
820
825
|
},
|
|
826
|
+
{
|
|
827
|
+
"address": "BYSfa4LYpChyhLqvcB9o1vPp9riGUECPuaQ8tkw1ii5G",
|
|
828
|
+
"name": "Base Series - Collection Quests",
|
|
829
|
+
"category": "MLB"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"address": "HsBQUnEYazNyBAgBBbHQiux28gThnoozqz4f3PPQrTpH",
|
|
833
|
+
"name": "Base Series - Rainbow Rewards",
|
|
834
|
+
"category": "MLB"
|
|
835
|
+
},
|
|
821
836
|
{
|
|
822
837
|
"address": "B9bCpzeQHqudVddYYQBE8CTVRzqTJruXEqbK4F7JNvFn",
|
|
823
838
|
"name": "Bat Cowl Honorary Collection",
|
package/data/issuers.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"derivedAt": "2026-
|
|
3
|
-
"collectionsRead":
|
|
2
|
+
"derivedAt": "2026-10-08T10:31:15.788Z",
|
|
3
|
+
"collectionsRead": 401,
|
|
4
4
|
"collectionsUnreadable": 0,
|
|
5
5
|
"issuers": [
|
|
6
6
|
{
|
|
7
7
|
"address": "BhA2Bfd8t2F2jDiUNdioGRJQt7MiaWo3Ro5H2Yt7APe2",
|
|
8
8
|
"issuer": "Candy Digital",
|
|
9
9
|
"role": "update authority of the collections listed in data/candy-collections.json; signs the mints",
|
|
10
|
-
"collections":
|
|
10
|
+
"collections": 401,
|
|
11
11
|
"sample": [
|
|
12
12
|
{
|
|
13
13
|
"address": "5LQ7jqaxRFYmnsk72ejFZ2cuGRABuky9Rik5bY9KGrCr",
|
package/dist/identify.js
CHANGED
|
@@ -496,15 +496,22 @@ async function runIdentify(q, signal, timedOut) {
|
|
|
496
496
|
throw osOutcome.err;
|
|
497
497
|
const stats = osOutcome;
|
|
498
498
|
// OpenSea answers 200 for slugs that do not really exist, returning an
|
|
499
|
-
// empty shell. Judge the payload, never the status code.
|
|
500
|
-
|
|
499
|
+
// empty shell. Judge the payload, never the status code. ANY owner, sale
|
|
500
|
+
// or volume is evidence the collection exists; a floor only says
|
|
501
|
+
// something is listed right now, and its absence proves nothing about
|
|
502
|
+
// existence. (One owner plus no listings used to be called a placeholder.)
|
|
503
|
+
const exists = (stats.owners ?? 0) > 0 || (stats.totalSales ?? 0) > 0 || (stats.totalVolume ?? 0) > 0 || (stats.floor ?? 0) > 0;
|
|
504
|
+
if (exists) {
|
|
501
505
|
identifiers.openseaSlug = osSlug;
|
|
502
506
|
tradesOn.push("OpenSea");
|
|
507
|
+
const listed = stats.floor !== null && (stats.floor ?? 0) > 0;
|
|
503
508
|
checked.push({
|
|
504
509
|
source: "opensea",
|
|
505
510
|
looked_for: `a collection with slug "${osSlug}"`,
|
|
506
511
|
result: "found",
|
|
507
|
-
detail:
|
|
512
|
+
detail: listed
|
|
513
|
+
? `floor ${stats.floor} ${stats.floorCurrency ?? "(currency not stated)"}, ${stats.owners ?? "unknown"} owners`
|
|
514
|
+
: `exists (${stats.owners ?? "unknown"} owners, ${stats.totalSales ?? "unknown"} lifetime sales) but nothing is listed on OpenSea right now`,
|
|
508
515
|
});
|
|
509
516
|
}
|
|
510
517
|
else {
|
|
@@ -512,7 +519,7 @@ async function runIdentify(q, signal, timedOut) {
|
|
|
512
519
|
source: "opensea",
|
|
513
520
|
looked_for: `a collection with slug "${osSlug}"`,
|
|
514
521
|
result: "not_found",
|
|
515
|
-
detail: "OpenSea returned HTTP 200
|
|
522
|
+
detail: "OpenSea returned HTTP 200 with an empty shell: no owners, no sales, no volume and no listing. That is a placeholder slug, not a collection.",
|
|
516
523
|
});
|
|
517
524
|
}
|
|
518
525
|
}
|