Skip to main content
Glama
swl007007

sellthenews-mcp

by swl007007
README.md
# sellthenews-mcp

A read-only MCP (Model Context Protocol) server that wraps [sellthenews.org](https://sellthenews.org) API endpoints, making financial news and options data available as tools for LLMs like Claude.

## Architecture

```
sellthenews.org API  →  Adapters  →  Services  →  MCP Tools & Resources
```

**Four layers, each with one job:**

| Layer | What it does | Files |
|-------|-------------|-------|
| **Domain** | Defines TypeScript types for all data shapes | `src/domain/*.types.ts` |
| **Adapters** | Fetch raw JSON from upstream APIs (no processing) | `src/adapters/*.adapters.ts` |
| **Services** | Normalize raw data into clean domain objects | `src/services/*.service.ts` |
| **MCP** | Expose tools and resources to LLM clients | `src/mcp/*.tools.ts` |

Data flows left to right: the MCP layer calls services, services call adapters, adapters call the HTTP client.

## Upstream APIs

| Endpoint | Description |
|----------|-------------|
| `GET /api/live/recent` | Latest news feed with pinned stories |
| `GET /api/wsb/latest` | Wall Street Bets daily analysis snapshot |
| `GET /api/search` | Keyword-based news search |
| `GET /api/options/chain` | Options chain, GEX, and greek exposure |

## MCP Tools

| Tool | Description | Key inputs |
|------|-------------|------------|
| `get_recent_news` | Latest news stories | `limit`, `offset`, `lang`, `sources`, `marketOnly` |
| `get_wsb_snapshot` | WSB daily analysis | `lang` |
| `search_news` | Search news by keyword | `query`, `limit`, `offset`, `lang`, `sources`, `sort` |
| `get_options_chain` | Full options chain for a ticker | `ticker`, `expiration`, `greeks` |
| `get_options_summary` | Concise options exposure summary | `ticker` |

## MCP Resources

| URI | Description |
|-----|-------------|
| `sellthenews://news/recent` | Latest news feed (ambient context) |
| `sellthenews://wsb/latest` | Latest WSB snapshot (ambient context) |

## Setup

```bash
npm install
npm run build
```

## Run Locally

```bash
npm start
```

The server runs over stdio, so it is meant to be launched by an MCP client such as Claude Desktop or an MCP inspector rather than opened in a browser.

For private single-user compatibility testing, the HTTP client can also read `SELLTHENEWS_USER_AGENT`, `SELLTHENEWS_COOKIE`, `SELLTHENEWS_ACCEPT_LANGUAGE`, and `SELLTHENEWS_REFERER` from the environment and forward them as request headers when present.

## Usage with Claude Desktop

Add this to your Claude Desktop MCP config file. On macOS it's at `~/Library/Application Support/Claude/claude_desktop_config.json`, on Windows it's at `%APPDATA%\Claude\claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "sellthenews": {
      "command": "node",
      "args": ["/REPLACE/WITH/YOUR/ACTUAL/PATH/sellthenews_MCP/dist/index.js"]
    }
  }
}
```

> **Important:** Replace the path above with the actual absolute path to `dist/index.js` on your machine. For example, on Windows it might be `C:\\Users\\yourname\\Desktop\\sellthenews_MCP\\dist\\index.js`.

## Project Structure

```
src/
  domain/
    shared.types.ts       # Common types (SourceInfo, TickerMention, etc.)
    news.types.ts         # News domain: raw API types + clean domain types
    options.types.ts      # Options domain: raw API types + clean domain types
  infra/
    http-client.ts        # HTTP client wrapping fetch()
  adapters/
    news.adapters.ts      # 3 news adapters (live/recent, wsb, search)
    options.adapters.ts   # 1 options adapter (options/chain)
  services/
    news.service.ts       # News normalization logic
    options.service.ts    # Options normalization logic
  mcp/
    news.tools.ts         # News MCP tools + resources + Zod schemas
    options.tools.ts      # Options MCP tools + Zod schemas
  index.ts                # Entry point: wires layers, starts server
```

## Current Status

Stage 2A is complete. The repository now performs real upstream GET requests, normalizes raw responses into domain objects, and exposes live MCP tools/resources that return consistent JSON text.

**Implemented now:**
1. `HttpClient.get()` with URL building, timeout handling, JSON parsing, and clearer error messages
2. Real adapters for all four identified sellthenews endpoints
3. Service-layer normalization for news feeds, WSB snapshots, options chains, and options summaries
4. Live MCP tool and resource handlers wired to the service layer
5. Optional env-driven compatibility headers for private single-user testing when plain server-side requests hit upstream protection

**Still pending:**
1. Automated tests for adapters, services, and MCP smoke coverage
2. Better operational hardening if upstream failures or Cloudflare issues show up in practice
3. Stage 3 concerns such as caching, rate limiting, and production logging

## Quick Smoke Check

1. Run `npm run build`
2. Run `npm start`
3. Connect the server from Claude Desktop or an MCP inspector
4. Call `get_recent_news` with `{ "limit": 2 }` or `get_options_summary` with `{ "ticker": "MU" }`

If upstream access works, the response should be pretty-printed JSON instead of placeholder text.

If upstream blocks plain server-side requests, retry your local run with `SELLTHENEWS_USER_AGENT`, `SELLTHENEWS_COOKIE`, `SELLTHENEWS_ACCEPT_LANGUAGE`, and `SELLTHENEWS_REFERER` set in the environment as needed.

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation4/5

Most tools have distinct purposes: options chain vs. summary, recent news vs. search, and WSB snapshot. However, 'get_recent_news' and 'search_news' could overlap if an agent wants recent news on a specific topic, as both handle news retrieval but with different approaches (time-based vs. keyword-based).

Naming Consistency5/5

All tools follow a consistent 'verb_noun' pattern with 'get_' or 'search_' prefixes, using snake_case uniformly. This predictable naming makes it easy for agents to understand and select tools without confusion.

Tool Count5/5

With 5 tools, this server is well-scoped for its financial/news domain. Each tool serves a clear, non-redundant function, covering options data, news retrieval, and WSB analysis, which is appropriate for a focused set of operations.

Completeness4/5

The toolset covers key areas like options analysis and news retrieval effectively, with no obvious dead ends. A minor gap is the lack of historical data tools (e.g., for options or news trends), but agents can still perform core tasks with the provided tools.