MCP server for Spoken Alpha — earnings-call data and language signals API. Tools for ir-page lookup, earnings-calls history, and press-releases (scaffolded).
Project description
spoken-alpha-mcp
MCP (Model Context Protocol) server that exposes the Spoken Alpha public API as tools any Claude-using agent can call by name.
The server is a thin client over api.spokenalpha.com/v1/*. It does not bypass auth, expose internal endpoints, or add functionality beyond what the public API ships. Wrapping, not extending.
What it gives you
Three tools, one per Tier 1 endpoint in the public API reference:
| Tool | Endpoint | Status in v1 |
|---|---|---|
get_ir_page |
GET /v1/companies/{ticker}/ir-page |
Live |
get_earnings_calls |
GET /v1/companies/{ticker}/earnings-calls |
Live |
get_press_releases |
GET /v1/companies/{ticker}/press-releases |
Scaffolded — 503 until structured ingest ships |
All three accept a US ticker (AAPL, MSFT, BRK.B). get_earnings_calls also accepts limit, cursor, date_from, date_to, confirmed_only, plus client-side fiscal_year / fiscal_quarter filters.
Getting an API key
Spoken Alpha is in private beta. Email kyle@spokenalpha.com to request a key. Pricing tiers and the public listing are at spokenalpha.com/pricing. Set the raw key as SPOKEN_ALPHA_API_KEY — the server forwards it as Authorization: Bearer <key> on every request.
Install
Requires Python 3.11+.
pip install spoken-alpha-mcp
# or, after this package is published to the registry:
# uvx spoken-alpha-mcp
From a local checkout:
cd mcp/spoken-alpha-mcp
pip install -e .
Wire it into Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"spoken-alpha": {
"command": "spoken-alpha-mcp",
"env": {
"SPOKEN_ALPHA_API_KEY": "sk_live_..."
}
}
}
}
If spoken-alpha-mcp isn't on PATH, replace with the absolute install path or use python -m spoken_alpha_mcp.
Wire it into Claude Code
Per-project MCP server (in your repo's .mcp.json):
{
"mcpServers": {
"spoken-alpha": {
"command": "spoken-alpha-mcp",
"env": { "SPOKEN_ALPHA_API_KEY": "sk_live_..." }
}
}
}
Example session
You: Where's Apple's IR page, and when was their last earnings call?
Claude calls get_ir_page("AAPL") → returns
{ "ticker": "AAPL",
"company_name": "Apple Inc.",
"ir_page": { "url": "https://investor.apple.com/...", "validation_status": "valid", ... },
"_self": "..." }
Claude calls get_earnings_calls("AAPL", limit=1) → returns
{ "ticker": "AAPL",
"calls": [ { "id": "call_AAPL_2026Q2_earnings", "call_date": "2026-05-01", ... } ],
"pagination": { "next_cursor": null, "has_more": false },
"_self": "..." }
Claude: Apple's IR page is at investor.apple.com (validated). Their most
recent earnings call was Q2 FY2026 on 2026-05-01.
Error handling
Every tool returns either a success payload or an error payload of the shape:
{
"error": true,
"code": "ticker_not_found",
"message": "No company found for ticker.",
"status_code": 404,
"request_id": "8c3f1e2a-...",
"documentation_url": "https://api.spokenalpha.com/docs/errors#ticker_not_found"
}
Codes you'll see in practice:
unauthorized(401) — bad or missingSPOKEN_ALPHA_API_KEY.forbidden_for_tier(403) — your tier doesn't include this field/endpoint.ticker_not_found/ir_page_not_found(404) — company or IR URL missing.validation_error(422) — query param out of range.rate_limit_exceeded(429) — hourly/monthly cap;rate_limit_reset_atis the unix timestamp.data_not_yet_available(503) — forget_press_releasesin v1; the payload carriesplanned_launch.timeout/network_error— transport failure before reaching the API.
Configuration
| Env var | Default | Notes |
|---|---|---|
SPOKEN_ALPHA_API_KEY |
(required) | Raw bearer key from your dashboard. |
SPOKEN_ALPHA_API_BASE_URL |
https://api.spokenalpha.com/v1 |
Override for staging / local dev. |
Development
cd mcp/spoken-alpha-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
What this is NOT
- Not an MCP for our internal trading signals. The proprietary surface (per-speaker deviation, the LLM scorer composition,
short_signal_score) is walled off in ADR-0031 — by the same rules, this MCP only exposes the public API. - Not a richer client than the API itself. If a field isn't in the public API contract, it isn't in this MCP. New endpoints come through the API roadmap.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spoken_alpha_mcp-0.1.0.tar.gz.
File metadata
- Download URL: spoken_alpha_mcp-0.1.0.tar.gz
- Upload date:
- Size: 14.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68d515803b955f3335ac963033f019018719d70c95748caeed8108c1b19f85d7
|
|
| MD5 |
1c0d25a6d44d49bbf1fa3d29e571c569
|
|
| BLAKE2b-256 |
8e0cd2802d43b5b7ede526d896832498dfc566be5c2e2076099ca400c891af9e
|
File details
Details for the file spoken_alpha_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: spoken_alpha_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfe8857267eb4d0efaf66edd676153aaef572672063104c0c17b6d8783c4eb72
|
|
| MD5 |
625bb90c7359277a8b0eb4fdb61b4251
|
|
| BLAKE2b-256 |
e6246150ad51201d70c3744dc66bfb38bd8dde9438ef218044f2345c6f656bc9
|