GuidesBuild your first BCA agent

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:

  1. A BCA API key on the Free tier.
  2. @blockchainacademics/mcp running inside Claude Desktop.
  3. 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.

curl -s "https://api.blockchainacademics.com/v1/articles/search?q=bitcoin&limit=2" \
  -H "X-API-Key: $YOUR_KEY" | head -50

If 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/mcp

First 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.json

Windows:

notepad $env:APPDATA\Claude\claude_desktop_config.json

Paste (or merge) the BCA block

claude_desktop_config.json
{
  "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:

  1. Call search_news with {query: "Bitcoin ETF", limit: 3}.
  2. Receive three envelopes — each with data.items[] and attribution.citations[0] carrying cite_url, as_of, and source_hash.
  3. Compose a summary.
  4. Surface the cite_url values as clickable Markdown links.

Example output:

Three Bitcoin ETF stories from this week:

  1. BlackRock’s IBIT crosses $80B AUM — net inflows $450M on 2026-04-18. [source]
  2. Fidelity FBTC adds 2,300 BTC — ninth consecutive week of net positive flow. [source]
  3. SEC opens comment period on in-kind redemptions — April 28 deadline. [source]

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:

  1. Claude Desktop launched npx @blockchainacademics/mcp as a stdio subprocess.
  2. The MCP server advertised its 99 tools.
  3. Claude picked search_news based on your question phrasing.
  4. The server forwarded the call to https://api.blockchainacademics.com/v1/articles/search?q=Bitcoin+ETF&limit=3 with your BCA_API_KEY header.
  5. The backend returned three envelopes, each carrying attribution.citations[0].cite_url pre-stamped with src=claude-desktop&utm_medium=mcp&utm_campaign=search_news.
  6. 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:

PromptTool 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

Troubleshooting

SymptomFix
Hammer icon missing in Claude DesktopFully quit (Cmd+Q) and relaunch. Check ~/Library/Logs/Claude/mcp*.log.
"Missing BCA_API_KEY" in MCP logsConfirm the env block in claude_desktop_config.json. No trailing comma, no typo.
BCA_RATE_LIMIT on a Free keyFree is 60 req/min, 2,000/month. Upgrade at pricing or cache responses.
Stale cache after rotating the keyDelete ~/.npm/_npx/ and restart Claude Desktop.
Tools appear but return integration_pendingThat 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.