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-mcpPublish 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-mcpCursor 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 aTemplateV1(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:
SOCIAL_MCP_FONTS_DIR(if set)- Package
fonts/directory - Project
fonts/directory ~/.social-mcp/fonts- 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-endpicture_in_picture: Overlay second video on first
Transitions:
none: Direct cutfade: 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(trimby default orloopto 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": {}
}