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

eolas-reach-mcp

v0.1.14

Published

Minimal MCP Server for social tools (TG/Twitter) - no keychain

Readme

Eolas Reach MCP Server

Minimal MCP server scaffold for social tools (Telegram, Twitter). No OS keychain dependencies.

Usage

Build and run:

npm install
npm run build
npx eolas-reach-mcp

Publish or test via npx:

# Build and pack a tarball
npm run build
npm pack

# Option A: test globally from the packed tarball
npm i -g ./eolas-reach-mcp-*.tgz
eolas-reach-mcp

# Option B: npm link for local development
npm link
npx eolas-reach-mcp

Cursor MCP Integration

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "eolas-reach-mcp": {
      "command": "npx",
      "args": ["eolas-reach-mcp"]
    }
  }
}

Tools

Available tools:

  • createTwitterPost
  • replyToTwitterPost
  • getTwitterMentions
  • generateImage
  • generateNanoBananaImage
  • generateSeedanceVideo
  • mergeVideos
  • getTelegramUpdates
  • sendTelegramMessage
  • generateBrandImage
  • addBrandTemplate
  • listAvailableFonts
  • addReferenceImage
  • listReferenceImages

Brand image templates

Two tools help with branded image generation:

  • add_brand_template: Persist a TemplateV1 (fonts must reference accessible files)
  • generate_brand_image: Render a PNG from a registered template with text and optional image

Images can be provided as data URLs or HTTP(S) URLs. HTTP(S) URLs are fetched and inlined as data URLs before rendering. For fixed assets baked into the template, embed them in background.svg (you can include an <image href="data:...">).

Fonts

The server discovers fonts by family/weight/style.

Search order:

  1. SOCIAL_MCP_FONTS_DIR (if set)
  2. Package fonts/ directory
  3. Project fonts/ directory
  4. ~/.social-mcp/fonts
  5. System font directories (macOS defaults)

Use the list_available_fonts tool to inspect what’s available. To add custom fonts, drop .ttf/.otf files into ~/.social-mcp/fonts or set SOCIAL_MCP_FONTS_DIR to your font folder.

Example persisted template (use as template with add_brand_template):

{
  "id": "eolas_promo_v1",
  "width": 1200,
  "height": 675,
  "fonts": [
    { "family": "Inter", "weight": 700, "path": "/absolute/path/to/fonts/Inter-Bold.ttf" }
  ],
  "background": {
    "svg": "<svg xmlns='http://www.w3.org/2000/svg' width='1200' height='675'><defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='1'><stop offset='0%' stop-color='#120024'/><stop offset='100%' stop-color='#2A0054'/></linearGradient></defs><rect width='1200' height='675' fill='url(#g)'/><image x='40' y='40' width='120' height='120' href='data:image/png;base64,REPLACE_WITH_BASE64_LOGO'/></svg>"
  },
  "text": {
    "box": { "x": 200, "y": 160, "w": 900, "h": 380 },
    "style": { "fontFamily": "Inter", "fontWeight": 700, "color": "#FFFFFF", "align": "left" },
    "fit": { "maxFont": 72, "minFont": 26, "lineHeight": 1.08, "wrap": "word" }
  },
  "image": {
    "box": { "x": 980, "y": 40, "w": 140, "h": 140 },
    "fit": "contain",
    "radius": 16,
    "opacity": 1
  }
}

Rendering call:

{
  "name": "generate_brand_image",
  "arguments": {
    "template_id": "eolas_promo_v1",
    "text": "Telegram is now open for discussion. Join the thread.",
    "image": "https://example.com/logo.png"
  }
}

Replicate (Nano Banana)

Set REPLICATE_API_TOKEN in your environment before starting the server:

export REPLICATE_API_TOKEN="r8_..."

Call example:

{
  "name": "generate_nano_banana_image",
  "arguments": {
    "prompt": "Make the sheets in the style of the logo. Make the scene natural.",
    "image_input": [
      "https://replicate.delivery/pbxt/NbYIclp4A5HWLsJ8lF5KgiYSNaLBBT1jUcYcHYQmN1uy5OnN/tmpcqc07f_q.png",
      "https://replicate.delivery/pbxt/NbYId45yH8s04sptdtPcGqFIhV7zS5GTcdS3TtNliyTAoYPO/Screenshot%202025-08-26%20at%205.30.12%E2%80%AFPM.png"
    ]
  }
}

The tool returns MCP-standard content with a JSON string that includes url (if present) and the raw Replicate output.

Video Generation & Merging

Seedance Video Generation

Generate videos from images using ByteDance's Seedance-1 Pro model:

{
  "name": "generate_seedance_video",
  "arguments": {
    "prompt": "Cinematic movement with dramatic lighting",
    "image": "https://example.com/image.jpg",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }
}

Video Merging

Merge multiple videos with various strategies:

{
  "name": "merge_videos",
  "arguments": {
    "video_urls": [
      "https://replicate.delivery/video1.mp4",
      "https://replicate.delivery/video2.mp4"
    ],
    "merge_strategy": "concatenate",
    "transition": "fade",
    "output_format": "mp4",
    "audio_url": "https://example.com/soundtrack.mp3"
  }
}

Merge Strategies:

  • concatenate: Join videos end-to-end
  • picture_in_picture: Overlay second video on first

Transitions:

  • none: Direct cut
  • fade: 1-second fade between videos

Output Formats:

  • mp4, mov, avi

Soundtrack Replacement:

  • Optional audio_url (https/data/local) replaces clip audio.
  • Control duration with audio_behavior (trim by default or loop to fill the full merged length).

Transition Reliability:

  • Inputs are normalized (resolution, frame rate, pixel format) before merging so fades work consistently across source formats.

Reference Images

Persist reference images for consistent character generation:

{
  "name": "add_reference_image",
  "arguments": {
    "source": "https://example.com/character.jpg",
    "name": "main_character"
  }
}

List saved references:

{
  "name": "list_reference_images",
  "arguments": {}
}