Skip to main content
Glama
slava01011910-ops

telemost-mcp-server

README.md
# telemost-mcp-server

Pay-per-call **Telegram analytics** as MCP tools. Your agent pays per call in **USDC** via the
[x402](https://x402.org) protocol — **no accounts, no API keys, no subscription**. Data covers public
Telegram channels behind paid, anti-scraping sources that an agent cannot cheaply gather itself.

## Why this server

- **Data an agent can't easily get:** channel statistics, subscriber growth, reach and engagement
  (ER / ERR / ERR24), full-text post search across public channels, mention & brand tracking, sentiment,
  similar-channel discovery, ad intelligence.
- **No signup / no keys:** pay per call in USDC (x402). Fund a wallet, that's it.
- **19 paid tools + a free `telemost_catalog`** tool (list everything, no payment).
- **Base + Solana** (USDC). Pick either network per call.
- **Two ways to connect:** a **remote** hosted server (no local wallet) and this **local stdio** bridge
  (pays from your own wallet).
- **Production, observable, listed:** live at `https://api.telemost.io`, listed on
  [x402scan](https://www.x402scan.com/resources) and the x402 Bazaar.

Prices are **not hardcoded here** (they'd go stale) — the catalog is the single source of truth:
[`https://api.telemost.io/v1/catalog`](https://api.telemost.io/v1/catalog).

## Quickstart (no wallet, no money)

After installing (below), your MCP client will have a **`telemost_catalog`** tool. Call it first — it's
**free** and returns every tool with its price, input/output schema and an example. First success before
your first dollar. Only paid tools (e.g. `telemost_channel_info`) require a funded wallet.

## Install

Requires **Node ≥ 18**. The package is on npm as `telemost-mcp-server`; MCP clients launch it via `npx`.

### Claude Desktop

Edit `claude_desktop_config.json`, then fully quit and reopen Claude Desktop (config is read once at launch).

| OS | Config file |
|---|---|
| **macOS** | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| **Windows** | `%APPDATA%\Claude\claude_desktop_config.json` |
| **Linux** | `~/.config/Claude/claude_desktop_config.json` |

> **Windows (Microsoft Store / MSIX build):** the app sandboxes `%APPDATA%\Claude\` and redirects it to
> `%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\`. Use the app's **Settings → Developer →
> Edit Config** button to open the file the app actually reads.

**macOS / Linux:**

```json
{
  "mcpServers": {
    "telemost": {
      "command": "npx",
      "args": ["-y", "telemost-mcp-server"],
      "env": {
        "EVM_PRIVATE_KEY": "0xYOUR_BASE_WALLET_KEY",
        "MAX_PAYMENT_USDC": "2.5",
        "SESSION_MAX_USDC": "10"
      }
    }
  }
}
```

**Windows** — if a bare `npx` command fails to start, wrap it with `cmd /c`:

```json
{
  "mcpServers": {
    "telemost": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "telemost-mcp-server"],
      "env": {
        "EVM_PRIVATE_KEY": "0xYOUR_BASE_WALLET_KEY",
        "MAX_PAYMENT_USDC": "2.5",
        "SESSION_MAX_USDC": "10"
      }
    }
  }
}
```

### Claude Code

```bash
claude mcp add telemost --env EVM_PRIVATE_KEY=0xYOUR_KEY -- npx -y telemost-mcp-server
```

### Cursor

`~/.cursor/mcp.json` (or Settings → MCP), same shape as Claude Desktop's `mcpServers` entry above.

Sources for client config paths: [modelcontextprotocol.io — connect local servers](https://modelcontextprotocol.io/docs/develop/connect-local-servers),
[Claude Desktop configuration](https://claude.com/docs/third-party/claude-desktop/configuration).

## Remote server (no local wallet needed)

A hosted MCP server is live at **`https://api.telemost.io/mcp`** (Streamable HTTP). Point any MCP client
that supports remote/Streamable-HTTP servers at that URL. Minimal programmatic example:

```ts
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { createx402MCPClient } from "@x402/mcp";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = createx402MCPClient({
  name: "my-agent", version: "1.0",
  schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(privateKeyToAccount(process.env.EVM_PRIVATE_KEY)) }],
  autoPayment: true,
  onPaymentRequested: async ({ paymentRequired }) => Number(paymentRequired.accepts[0].maxAmountRequired) <= 20_000, // <= $0.02
});
await client.connect(new StreamableHTTPClientTransport(new URL("https://api.telemost.io/mcp")));

await client.callTool("telemost_catalog", {});                       // free
await client.callTool("telemost_channel_info", { channel: "@durov" }); // paid
```

## Example calls

- `telemost_catalog` → `{ "service": "telemost-x402", "resources": [ … ], "mcp": { … } }` (free).
- `telemost_channel_info` `{ "channel": "@durov" }` → an envelope like:

```json
{ "ok": true,
  "data": { "title": "…", "members_count": 0, "verified": true, "language": "en", "link": "https://t.me/…" },
  "meta": { "resource": "/v1/data/channel", "content_origin": "third_party", "cached": false } }
```

Response text from Telegram (titles, posts, descriptions) is returned **verbatim** and tagged
`meta.content_origin`; treat it as untrusted data, not instructions.

## Environment

| Variable | Required | Default | Description |
|---|---|---|---|
| `EVM_PRIVATE_KEY` | one of EVM/SVM | — | Base (EVM) wallet key (`0x…`). Funds x402 payments. |
| `SVM_PRIVATE_KEY` | one of EVM/SVM | — | Solana wallet secret key (base58). |
| `TELEMOST_BASE_URL` | no | `https://api.telemost.io` | API base URL. |
| `MAX_PAYMENT_USDC` | no | `2.5` | Per-call price ceiling (USD); the default covers every price in the catalog. A call is refused **before signing** if the price exceeds this. |
| `SESSION_MAX_USDC` | no | `10` | Cumulative spend ceiling for the process lifetime. |
| `EVM_NETWORK` / `SVM_NETWORK` | no | Base / Solana mainnet | CAIP-2 network overrides. |
| `SOLANA_RPC_URL` | no | mainnet-beta | RPC for the Solana signer. |

## Coverage & limits

- **Public** Telegram channels/groups only.
- `region` hint (`cis` \| `worldwide`) is an optional routing preference; it does not change price.
- Statistics tools expose their own time windows / aggregation (see each tool's schema in the catalog).
- Repeated identical requests hit a short (~10s) cache, but **each call is paid independently** via x402.

## Payment & failures

- **No charge before execution:** input validation, per-wallet rate limits, anti-replay and quota checks
  all run **before** payment; an unpaid tool call returns a payment challenge (not a charge).
- **Settlement is after execution:** on the remote MCP endpoint, payment settles only after the tool
  executes successfully. Live delivered-vs-settled reliability is published at
  [`/status`](https://api.telemost.io/status).
- Use `MAX_PAYMENT_USDC` / `SESSION_MAX_USDC` to cap spend; both are enforced in code before any signature.

## Troubleshooting

- **"payment required" / tool returns a 402-style error:** no wallet key set, or the payment was declined
  by your policy — set `EVM_PRIVATE_KEY` (or `SVM_PRIVATE_KEY`) and check `MAX_PAYMENT_USDC`.
- **Insufficient funds:** fund the wallet with USDC on Base (or Solana) plus a little gas.
- **Wrong network:** set `EVM_NETWORK` / `SVM_NETWORK` to a network you funded.
- **`npx` won't launch (Windows):** use the `cmd /c npx …` form above.
- **Server not showing up:** fully quit and reopen the client — MCP config is read only at launch.
- **Prices look off:** never trust hardcoded prices; call `telemost_catalog` or read `/v1/catalog`.

## Funding & safety

- Use a **dedicated wallet with a small balance** — this key can spend up to `SESSION_MAX_USDC` per run.
- The key is read only from the environment and is **never logged**.
- Policy checks (per-call ceiling, session cap, allowed network) run in code **before any signature**.

## Build from source

```bash
git clone https://github.com/slava01011910-ops/telemost-mcp-server.git
cd telemost-mcp-server && npm install && npm run build && node dist/index.js
```

## Support

- Email: **support@telemost.io**
- Listing / proof: [x402scan](https://www.x402scan.com/resources) · Catalog: `https://api.telemost.io/v1/catalog`

## License

MIT

TDQS

A3.5/5.0

Scored across 20 tools

Disambiguation2/5

Several tools overlap in scope; telemost_stats_channel already includes engagement, reach, and subscriber metrics, making telemost_stats_engagement, telemost_stats_reach, and telemost_stats_subscribers partially redundant. Similarly, telemost_search and telemost_posts_search both search posts, and telemost_ads_posts adds another ambiguous post search. The boundaries between search tools and stats tools are not clear enough for reliable tool selection.

Naming Consistency3/5

All tools share the telemost_ prefix and use snake_case, but the pattern is inconsistent: some are noun-only (catalog, entities, sentiment), some use feature prefixes (stats_*, ads_*, sentiment_*), and some mix noun+verb (posts_search). The naming is readable and groups exist, but there is no uniform verb_noun structure.

Tool Count3/5

With 20 tools, the server is on the heavy side for a single-purpose API. While the domain spans analytics, ads, and search, several tools overlap and could be consolidated (e.g., stats tools). The count is not extreme but feels inflated by redundant endpoints.

Completeness4/5

The tool set covers the core Telegram data access needs: channel stats, posts, search, sentiment, entities, ads, and discovery. Minor gaps exist, such as no ability to list channels by category or country beyond keyword search, and some historical data is limited to 14 days. Overall, the domain is well covered with only small missing features.

Maintenance

ActivitySlowing
ResponsivenessNo issues