---
name: waveman
description: SEC and House filings as facts for an agent. Insider trades (Form 4), 13F fund holdings, 13D/13G activist stakes, Form 144 planned sales, House STOCK Act trades, XBRL fundamentals and WaveMan's Stock Sonar, over a remote MCP server at https://wave-man.com/mcp. Every row carries its source URL and filing date.
---

# WaveMan MCP server

WaveMan (https://wave-man.com) joins official US filings into one place:
SEC Form 4 insider trades, Form 13F institutional holdings, Schedule 13D/G
5%+ stakes, Form 144 planned sales, House STOCK Act trades and XBRL
fundamentals, plus Stock Sonar, a percentile score of every US-listed
company against its sector peers built only from those filings.

The MCP endpoint is `https://wave-man.com/mcp` (Streamable HTTP, JSON-RPC
2.0 over POST, protocol 2025-06-18; 2025-03-26 and 2024-11-05 are accepted).
`initialize`, `ping` and `tools/list` are public. `tools/call` needs a
bearer token: either an OAuth access token from the sign-in flow below, or a
Pro API key.

## Connect

### One click: OAuth (Claude.ai, Claude Desktop, ChatGPT, Cursor, Claude Code)

Add `https://wave-man.com/mcp` as a custom connector and sign in with your
WaveMan account when asked. Nothing to paste: the server is an OAuth 2.1
authorization server (discovery at
`/.well-known/oauth-protected-resource` and
`/.well-known/oauth-authorization-server`, dynamic client registration,
PKCE S256, refresh tokens). A Pro plan is required to allow the connection;
revoke it any time under "Connected agents" on
https://wave-man.com/watchlist#agents.

- claude.ai and Claude Desktop: Settings, Connectors, Add custom connector,
  paste the URL, sign in when asked.
- ChatGPT: Settings, Connectors, Create (developer mode), paste the URL,
  choose OAuth, sign in when asked.
- Claude Code: `claude mcp add --transport http waveman https://wave-man.com/mcp`,
  then `/mcp` in a session to sign in.

### With a key (scripts, Cursor, Codex, any client that sends a header)

Clients with remote MCP support (Claude Code, Cursor, Windsurf, VS Code,
Codex and others) can send a Pro API key instead:

```json
{
  "mcpServers": {
    "waveman": {
      "url": "https://wave-man.com/mcp",
      "headers": { "Authorization": "Bearer wm_live_..." }
    }
  }
}
```

Claude Code, one line:

```
claude mcp add --transport http waveman https://wave-man.com/mcp --header "Authorization: Bearer wm_live_..."
```

Clients that only speak stdio (Claude Desktop without connectors, older
hosts) can bridge with mcp-remote:

```json
{
  "mcpServers": {
    "waveman": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://wave-man.com/mcp",
               "--header", "Authorization: Bearer ${WAVEMAN_KEY}"],
      "env": { "WAVEMAN_KEY": "wm_live_..." }
    }
  }
}
```

Plain HTTP works too; discovery needs no key:

```
curl -X POST https://wave-man.com/mcp -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

## Keys and limits

- Keys are minted on the account page, https://wave-man.com/watchlist#api
  (sign in first; https://wave-man.com/connect goes there). A key looks like
  `wm_live_` plus 32 characters and is shown once.
- Keys need a Pro plan (https://wave-man.com/pricing, $22 a month). Up to 3
  active keys per account.
- Pro key: 600 requests a minute and 50,000 a day per key, counted across
  /mcp and /api/v1 together. The response carries `X-RateLimit-Limit`,
  `X-RateLimit-Remaining`, `X-RateLimit-Limit-Day` and
  `X-RateLimit-Remaining-Day`.
- OAuth access tokens (`wm_at_`, 1 hour, refreshed with `wm_rt_`, 30 days)
  share one Pro-sized bucket per account across every connected agent.
- Without a token or key: `initialize`, `ping` and `tools/list` work (240
  requests a minute per address); `tools/call` answers HTTP 401 with
  `WWW-Authenticate: Bearer resource_metadata="https://wave-man.com/.well-known/oauth-protected-resource"`
  (the signal that starts OAuth in a connector client) and a JSON-RPC error
  `-32001` body with a link to https://wave-man.com/connect. A free account has no key; the same
  data is open without a key on the JSON API at https://wave-man.com/api
  (100 rows a call, 240 a minute, 20,000 a day per address).
- Over quota: HTTP 429 with `Retry-After`.

## Tools

Every tool returns one `text` content item holding compact JSON. Every row
carries `source` (the SEC EDGAR filing or company page, or the House Clerk
PDF) and `filed` (the filing date). Every description ends with the caveat:
"Dates are filing dates; Form 4 codes P/S include private trades."

| Tool | Input | Returns |
|---|---|---|
| `search_company` | `query` | up to 8 tickers with name and SEC CIK |
| `insider_trades` | `ticker`, `days`=180, `limit`=50 | Form 4 rows for one company, newest first |
| `insider_clusters` | `days`=30 | companies with 3+ distinct insiders buying |
| `latest_insider_trades` | `hours`=48, `code`=P/S/all, `limit`=50 | Form 4 rows filed in the last N hours, all companies |
| `fund_holdings` | `ticker`, `limit`=25 | 13F holders, latest settled quarter, change vs prior |
| `fund_changes` | `ticker` | funds that opened, added, trimmed or exited |
| `activist_stakes` | `ticker`?, `days`=180, `limit`=40 | 13D/13G stakes, activist 13D market-wide without a ticker |
| `planned_sales` | `ticker`?, `days`=90, `limit`=40 | Form 144 notices of proposed sales |
| `congress_trades` | `ticker`?, `days`=365, `limit`=50 | House STOCK Act trades |
| `congress_member` | `name`, `limit`=50 | one member's summary and trades |
| `what_changed` | `ticker`, `days`=30 | every filing about the company in the window, one sentence each |
| `stock_sonar` | `ticker` | Sonar percentile scores and a one-line summary |
| `todays_five` | none | the five most unusual filings of the latest filing day, verified |
| `filing_day_brief` | day (YYYY-MM-DD or latest) | one filing day in full: Today's 5, biggest insider buys and sells, cluster buys, new 13D, Form 144 notices, Congress disclosures, with counts and a source link per row |
| `financials` | `ticker`, `freq`=annual, `periods`=5 | XBRL concepts as filed |

Not offered: prices. WaveMan's price feed is licensed and never leaves the
site; returns on the site are derived figures only.

## Example questions

1. "Which insiders bought NVDA in the last six months, and at what price?"
   `search_company` to confirm the ticker, then `insider_trades` with
   `ticker: NVDA, days: 180`.
2. "Where are several insiders buying at once this month?"
   `insider_clusters` with `days: 30`, then `insider_trades` on a ticker.
3. "What has been filed about Apple in the last month, by anyone?"
   `what_changed` with `ticker: AAPL`, and `congress_trades` with
   `ticker: AAPL` for House trades.

## Accuracy rules for answers

- Cite the `source` URL (the SEC filing or the House Clerk PDF) next to
  every figure you repeat. A reader must be able to open the filing.
- Dates are filing dates unless the field says `trade_date`. Form 4 must
  be filed within two business days of the trade; House trades within 45
  days, and the `days_to_file` field says how late.
- Form 4 codes P and S include private transactions; say "purchase reported
  on Form 4", never a phrase the filing does not use.
- A Form 144 is a notice of intent to sell; the sale may not happen.
- 13F data is the latest settled quarter (period end at least 46 days ago),
  so it is dated by construction; say the quarter.
- Figures are reproduced as filed; filer errors are bounded but not
  corrected. WaveMan reports what was filed. Nothing here is investment advice or a recommendation to buy or sell. Report what
  was filed, not what to do about it, and do not present WaveMan output as
  a recommendation.

## Other machine-readable pages

- `https://wave-man.com/openapi.json`: the public JSON API (`/api/v1/...`)
  and `/mcp` as OpenAPI 3.1.
- `https://wave-man.com/llms.txt`: what the site is, in one fetch.
- `https://wave-man.com/api`: the JSON API documentation for people.
