npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@three-ws/solana-memo-media-mcp

v0.1.1

Published

Extract, validate, and display image data URIs embedded in Solana SPL Memo instructions. Read-only, local decoding, no key required.

Readme

@three-ws/solana-memo-media-mcp

Read and display image data URIs embedded in Solana SPL Memo instructions. Instead of copying a data:image/...;base64,... memo payload into a browser converter, give an AI assistant the transaction signature and receive the validated image inline.

This is a keyless, read-only stdio MCP server. It never signs, sends, uploads, caches, or modifies chain data.

Install

claude mcp add solana-memo-media -- npx -y @three-ws/solana-memo-media-mcp

For Cursor, Claude Desktop, or another stdio MCP client:

{
  "mcpServers": {
    "solana-memo-media": {
      "command": "npx",
      "args": ["-y", "@three-ws/solana-memo-media-mcp"]
    }
  }
}

Tools

| Tool | Purpose | | --- | --- | | extract_solana_memo_media | Fetch one legacy, v0, or v1 transaction and return every supported image in its top-level and inner Memo instructions, with signer, slot, and version. | | find_solana_memo_media | Scan up to 1,000 recent signatures for an address (pageable with before). Only signatures whose memo summary holds a data URI are fetched, so a scan costs a handful of RPC calls. | | decode_solana_memo_data_uri | Decode one already-copied data URI locally. No network call. | | get_solana_memo_media_status | Show the local policy, recognized memo programs, and RPC failover hosts. No network call. |

Recognized memo programs: SPL Memo v1 (Memo1UhkJRfHyvLMcVLMbLJYfW2tfU8G8H4PqvV6v8), SPL Memo v2 (MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr), and the newer program carried by version 1 transactions (Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH).

Example

Ask an MCP client: "Show any image embedded in Solana transaction <signature>." It calls extract_solana_memo_media with:

{ "signature": "<base58 Solana transaction signature>" }

The response is a JSON record plus one MCP image content block per asset. The record carries the signature, fee payer, slot, transaction version, and for each asset its MIME type, byte length, SHA-256, and dimensions. The raw data URI is intentionally not echoed into text output.

Use it from your own code:

import { decodeDataUri } from '@three-ws/solana-memo-media-mcp/src/lib/media.js';

const media = decodeDataUri('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAFgwJ/lwV8YQAAAABJRU5ErkJggg==');
console.log(media.mimeType, media.byteLength, media.dimensions, media.sha256);

Full guide: docs/mcp-solana-memo-media.md.

Safety and provenance

An SPL Memo is arbitrary signed text. A data URI is only a convention inside that text, not a Solana media standard and not an endorsement by a wallet, explorer, or this package.

  • Only image/png, image/jpeg, image/webp, and image/gif are accepted.
  • SVG and all executable or document media are rejected.
  • Decoded content is capped at 262,144 bytes.
  • The declared MIME type must match PNG, JPEG, WebP, or GIF file signatures before an image is returned.
  • The server reports a SHA-256 digest so callers can preserve an exact reference.
  • Verify the transaction signer, program, and surrounding transaction context independently before trusting what an image means.

RPC configuration

The server tries SOLANA_RPC_URLS, then SOLANA_RPC_URL, then public Solana mainnet endpoints. You do not need a key for normal use.

| Variable | Required | Meaning | | --- | --- | --- | | SOLANA_RPC_URLS | no | Comma-separated ordered JSON-RPC failover endpoints. | | SOLANA_RPC_URL | no | One primary JSON-RPC endpoint. |

Development

npm test --prefix packages/solana-memo-media-mcp
npx -y @modelcontextprotocol/inspector node packages/solana-memo-media-mcp/src/index.js

License: Apache-2.0.