Skip to main content
Glama
jgmcalpine

headless-records-mcp

by jgmcalpine
README.md
# Headless Records MCP Server

A local [Model Context Protocol](https://modelcontextprotocol.io) (MCP) stdio server that gives agents structured, non-advisory access to public SEC Form 4 insider filing data via the hosted Headless Records API. 

The server is a thin wrapper: it validates tool input, calls `https://api.headlessrecords.dev`, and returns the API's JSON responses as formatted text. It does not call SEC directly, does not connect to a database, and does not run ingestion jobs.

Full API documentation: [headlessrecords.dev](https://headlessrecords.dev) · [OpenAPI spec](https://api.headlessrecords.dev/openapi.json)

## Safety and Scope

- Responses summarize **public SEC Form 4 filing data** from a bounded, watched-ticker universe. They do not imply full-market coverage.
- Output is **not financial advice**. The server provides no buy, sell, hold, bullish, bearish, price prediction, alpha, trading signal, or investment recommendation guidance.
- API caveats, methodology notes, request IDs, timestamps, and source provenance are preserved in tool output so agents can show context rather than over-compress results.

## Requirements

- Node.js 20 or later (uses the built-in `fetch`)
- A Headless Records API key (`hr_live_` prefix) — [request design partner access](mailto:hello@headlessrecords.dev)
- No key yet? Try the open preview endpoint:
```bash
  curl https://api.headlessrecords.dev/v1/ticker/TSLA/preview
```

## Install and Build

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

The compiled server is written to `dist/index.js`.

## Configuration

The server is configured entirely through environment variables read from the process. Export them in your shell or set them in your MCP client config. (`.env.example` is a reference file only; the server does not auto-load `.env`.)

Required:

- `HEADLESS_RECORDS_API_KEY` — your API key, sent as the `X-API-Key` header.

Optional:

- `HEADLESS_RECORDS_API_BASE_URL` — defaults to `https://api.headlessrecords.dev`.
- `HEADLESS_RECORDS_TIMEOUT_MS` — per-request timeout, defaults to `10000`.

Do not commit real API keys.

## Running

Run from source:

```bash
HEADLESS_RECORDS_API_KEY=hr_live_REPLACE_ME npm start
```

Run the built stdio server:

```bash
HEADLESS_RECORDS_API_KEY=hr_live_REPLACE_ME node /absolute/path/to/dist/index.js
```

## MCP Client Configuration

Example configuration for Cursor, Claude Desktop, or any MCP client, after `npm run build`:

```json
{
  "mcpServers": {
    "headless-records": {
      "command": "node",
      "args": ["/absolute/path/to/dist/index.js"],
      "env": {
        "HEADLESS_RECORDS_API_KEY": "hr_live_REPLACE_ME"
      }
    }
  }
}
```

## Tools

### `get_freshness`

Returns freshness status for the configured watched-ticker universe.

```json
{
  "freshness_window_hours": 24
}
```

- `freshness_window_hours` (optional integer, 1–168, default `24`)

Calls `GET /v1/freshness`.

### `assess_insider_activity`

Returns a deterministic, non-advisory summary of reported SEC Form 4 insider activity for a ticker. Tickers are normalized to uppercase before the API call.

```json
{
  "ticker": "TSLA",
  "period": "90d",
  "freshness_window_hours": 24
}
```

- `ticker` (required string)
- `period` (optional, one of `30d`, `90d`, `180d`, default `90d`)
- `freshness_window_hours` (optional integer, 1–168, default `24`)

Calls `GET /v1/insider-activity/{ticker}/assessment`.

### `get_filing_provenance`

Returns source provenance for an imported SEC Form 4 filing, including the source document URL, retrieval timestamp, and SHA-256 hash when available.

```json
{
  "accession_number": "0000001001-26-000123"
}
```

- `accession_number` (required string)

Calls `GET /v1/provenance/filing/{accession_number}`.

## Error Behavior

Tool errors are returned as structured JSON with a stable `code` field:

- Missing, invalid, or revoked API keys surface as `unauthorized` (HTTP 401).
- Rate limits surface as `rate_limited` (HTTP 429), including `retry_after` when the API provides it.
- Timeouts, network failures, and invalid responses surface as `timeout`, `network_error`, and `invalid_json`.
- API request IDs are preserved in error output when available.
- Raw `hr_live_...` API keys are redacted from all error text.

## Development

```bash
npm test
```

Tests run with Vitest and use mocked HTTP; they never call the live API.

## Known Limitations

- Local stdio server only; this is not a hosted remote MCP server.
- Requires a valid `HEADLESS_RECORDS_API_KEY` and inherits the API's per-key rate limits.
- Coverage is bounded to the watched-ticker universe and imported filings; it does not fetch SEC data live.
- Does not manage watched tickers, billing, or authentication flows.
- Returns formatted JSON text; it does not transform API output into advice.

TDQS

B3.4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct aspect: insider activity summary, filing provenance, and data freshness. No overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case: assess_insider_activity, get_filing_provenance, get_freshness.

Tool Count4/5

3 tools is slightly below typical range, but the scope is narrow and each tool serves a clear purpose. No unnecessary tools.

Completeness3/5

Core functions are covered, but missing features like listing tickers or raw filing data. The bounded nature partly justifies the gaps.

Maintenance

ActivityStale
ResponsivenessNo issues