Build your first BCA agent
A complete walk-through from zero to a working Claude Desktop agent that answers crypto questions with cited sources. ~5 minutes, no crypto or LLM expertise assumed.
By the end you will have:
- A BCA API key on the Free tier.
@blockchainacademics/mcprunning inside Claude Desktop.- A chat that calls
search_news, handles the response envelope, and ends with a citation link the reader can click.
Prereqs — Claude Desktop v0.9+ installed, macOS or Windows, Node 18+. No npm global installs required.
1. Sign up and grab a key
Create an account
Visit brain.blockchainacademics.com/pricing and click Free tier — get started. No credit card.
Copy the key
On first login you land on the dashboard with your key pre-generated (bca_live_…). Copy it.
Smoke-test it (optional but recommended)
curl -s "https://api.blockchainacademics.com/v1/articles/search?q=bitcoin&limit=2" \
-H "X-API-Key: $YOUR_KEY" | head -50If you see an envelope with data, attribution.citations[], and meta.status: "complete", the key is live.
2. Install the MCP server in Claude Desktop
Prime the npx cache
npx -y @blockchainacademics/mcpFirst run downloads the package and prints a usage banner. Ctrl+C out — Claude Desktop will invoke it on demand after this.
Open your Claude Desktop config
macOS:
open -e ~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows:
notepad $env:APPDATA\Claude\claude_desktop_config.jsonPaste (or merge) the BCA block
{
"mcpServers": {
"blockchainacademics": {
"command": "npx",
"args": ["-y", "@blockchainacademics/mcp"],
"env": {
"BCA_API_KEY": "bca_live_YOUR_KEY_HERE"
}
}
}
}Fully quit and relaunch Claude Desktop
Cmd+Q on macOS, fully exit the taskbar icon on Windows. A normal close-the-window won’t reload the MCP config.
Confirm the tools loaded
Open a new chat. Click the hammer icon in the input bar. You should see blockchainacademics listed with 99 tools.
3. Ask your first question
Paste this into the chat:
“Use the BCA tools to summarize the top three stories about Bitcoin ETFs this week. Cite each story with the URL.”
Claude will:
- Call
search_newswith{query: "Bitcoin ETF", limit: 3}. - Receive three envelopes — each with
data.items[]andattribution.citations[0]carryingcite_url,as_of, andsource_hash. - Compose a summary.
- Surface the
cite_urlvalues as clickable Markdown links.
Example output:
Three Bitcoin ETF stories from this week:
Click any link. It opens the article on blockchainacademics.com with UTM params attached — which is how we attribute your agent’s readership back to you (and why stripping the links breaks the deal on Free / Starter — see Attribution).
4. Understand what just happened
Behind the scenes:
- Claude Desktop launched
npx @blockchainacademics/mcpas a stdio subprocess. - The MCP server advertised its 99 tools.
- Claude picked
search_newsbased on your question phrasing. - The server forwarded the call to
https://api.blockchainacademics.com/v1/articles/search?q=Bitcoin+ETF&limit=3with yourBCA_API_KEYheader. - The backend returned three envelopes, each carrying
attribution.citations[0].cite_urlpre-stamped withsrc=claude-desktop&utm_medium=mcp&utm_campaign=search_news. - Claude composed the summary and surfaced the links verbatim — satisfying the Free-tier attribution contract.
5. Iterate
Try these prompts next to exercise different tool categories:
| Prompt | Tool that fires |
|---|---|
| ”What’s the entity dossier on Circle?” | get_entity |
| ”Current sentiment on Solana, with social pulse?” | get_sentiment, get_social_pulse |
| ”Give me the BCA Coverage Index for Ethereum over 30 days.” | get_coverage_index |
| ”List the top 10 stablecoins by TVL.” | list_stablecoins |
| ”Generate a due-diligence memo on Sui.” (Pro tier — async job) | generate_due_diligence |
| ”Translate this contract to plain English.” (Pro tier, paste Sol) | translate_contract |
6. Handle the envelope yourself (optional)
When building a custom MCP client rather than using Claude Desktop, parse the envelope like this:
type Status = "complete" | "unseeded" | "partial" | "stale";
type Citation = { cite_url: string; as_of: string | null; source_hash: string | null };
type Envelope<T> = {
data: T | null;
attribution: { citations: Citation[] };
meta: {
status: Status;
request_id: string;
pageInfo: { hasNextPage: boolean; hasPreviousPage: boolean; startCursor: string | null; endCursor: string | null };
diagnostic?: { reason: string; [k: string]: unknown };
};
};
function renderAnswer(resp: Envelope<{items: Article[]}>) {
if (resp.meta.status !== "complete") {
return "That data source isn't live yet — try again later.";
}
const list = (resp.data?.items ?? [])
.map((a) => `- **${a.title}** — ${a.summary}`)
.join("\n");
const citation = resp.attribution.citations[0];
const suffix = citation
? `\n\n_Source: ${citation.cite_url} (retrieved ${citation.as_of})_`
: "";
return list + suffix;
}The attribution.citations[0] is the contract — if the server sets it, surface it.
7. Where next
- Response envelope — every field, every edge case.
- Attribution & licensing — the citation contract, in full.
- Tool reference — all 99 tools, schema + example per tool.
- REST API — the HTTP surface underneath, for server-side callers.
- LangChain quickstart — same pattern, Python.
Troubleshooting
| Symptom | Fix |
|---|---|
| Hammer icon missing in Claude Desktop | Fully quit (Cmd+Q) and relaunch. Check ~/Library/Logs/Claude/mcp*.log. |
"Missing BCA_API_KEY" in MCP logs | Confirm the env block in claude_desktop_config.json. No trailing comma, no typo. |
BCA_RATE_LIMIT on a Free key | Free is 60 req/min, 2,000/month. Upgrade at pricing or cache responses. |
| Stale cache after rotating the key | Delete ~/.npm/_npx/ and restart Claude Desktop. |
Tools appear but return integration_pending | That specific upstream isn’t wired yet — response carries meta.status: "unseeded" with meta.diagnostic.eta. |
Still stuck? Open an issue at github.com/blockchainacademics/bca-mcp or email dev@blockchainacademics.com.