Build your first agent
A complete walk-through from zero to a working Claude Desktop agent that answers crypto questions with cited sources. About five minutes, no crypto or LLM expertise assumed.
By the end you will have:
- A Crypto Brain 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.
1. Sign up and grab a key
Create an account
Go to blockchainacademics.com/crypto-api/signup and enter your email. No credit card.
Copy the key
The key (bca_live_…) arrives by email and is on your dashboard. 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 105 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: that is how we attribute your agent's readership back to you, and why stripping the links breaks the deal on Free and 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 105 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, which satisfies 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 Solidity) | 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 is not 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. Over MCP, data arrives as a fenced string that needs a second parse; see Parse the envelope.
7. Where next
- Response envelope: every field, every edge case.
- Attribution & licensing: the citation contract, in full.
- Tool reference: every tool with its arguments and an example call.
- 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 | You hit the free tier's rate limit or monthly quota. Cache responses, or upgrade on Pricing. |
| Stale cache after rotating the key | Delete ~/.npm/_npx/ and restart Claude Desktop. |
Tools appear but return integration_pending | That specific upstream is not wired yet: the response carries meta.status: "unseeded" with meta.diagnostic.eta. |
Still stuck? Open an issue at github.com/blockchainacademics/bca-mcp or email [email protected].