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 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-09-15",
4
- "count": 398,
3
+ "takenAt": "2026-10-08",
4
+ "count": 401,
5
5
  "categories": {
6
- "MLB": 100,
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-09-18T08:40:58.298Z",
3
- "collectionsRead": 398,
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": 398,
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
- if ((stats.floor ?? 0) > 0 || (stats.owners ?? 0) > 1) {
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: `floor ${stats.floor} ${stats.floorCurrency}, ${stats.owners} owners`,
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 but with an empty shell collection (no floor, no owners) - a placeholder slug, not a real listing",
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
  }