crypto-insight-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@crypto-insight-mcp What's the price of Bitcoin and Ethereum?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
crypto-insight-mcp
An MCP server that gives AI agents governed access to crypto market data and a company knowledge base — live prices and portfolio analytics from CoinGecko, plus RAG-based semantic search over internal documents (regulation, AML/KYC, custody, listing policy), with responsible-AI guardrails at every boundary.
Why this project
Connecting an LLM to a financial domain is easy to do badly: unvalidated tool inputs, upstream stack traces leaking into model context, retrieved documents silently rewritten into confident "advice". This project demonstrates the architecture I consider correct for the problem:
One domain, two transports. All business logic lives in a pure service layer. An MCP server (stdio) exposes it to AI agents; a FastAPI gateway exposes the same functions to humans and systems. Neither transport contains logic, so behaviour and guardrails cannot drift between them.
Guardrails as a first-class module. Input validation with LLM-actionable error messages, outbound rate limiting, mandatory not-financial-advice disclaimers on every analytical response, structured
{"error": ...}payloads instead of exceptions crossing the protocol boundary.Retrieval, not server-side synthesis. The RAG tool returns chunks with sources; the calling LLM does the reasoning. This division of labour is recorded in ADR-0003.
Runs anywhere, no keys. CoinGecko free tier, embedded Chroma, local ONNX embeddings with a deterministic offline fallback.
pytestpasses with no network at all (ADR-0002).
Related MCP server: crypto-projects-mcp
MCP tools
Tool | Arguments | Returns |
|
| Spot price + 24h change per symbol |
|
| Daily price points + min/max/change stats |
|
| Total value, per-position allocation %, HHI concentration index, warnings |
|
| Top-k knowledge-base chunks with |
Every analytical response includes a disclaimer field; every invalid input
produces {"error": "<what was wrong and what is acceptable>"} rather than a
crash.
Architecture
flowchart LR
subgraph Agents
claude["Claude Desktop / MCP client"]
end
subgraph Humans["Humans & systems"]
rest["REST clients"]
end
claude -- "MCP (stdio)" --> srv["server.py\nFastMCP · 4 tools"]
rest -- "HTTP" --> api["api.py\nFastAPI gateway"]
srv --> svc["services.py\ndomain logic"]
api --> svc
svc --> guard["guardrails.py\nvalidation · rate limit · disclaimer"]
svc --> mkt["market/client.py\nTTL cache · token bucket"]
svc --> kb["rag/search.py\nKnowledgeBase"]
mkt -- "HTTPS" --> cg["CoinGecko free API"]
kb --> chroma[("Chroma embedded\n.chroma/")]
docs["knowledge_base/*.md"] -- "rag/ingest.py" --> chromaMore detail in docs/architecture.md and the ADRs.
Quickstart
Requires Python ≥ 3.10.
git clone https://github.com/IgorAbramov/crypto-insight-mcp.git
cd crypto-insight-mcp
pip install -e ".[dev]"
# Build the knowledge-base index (embedded Chroma, local embeddings).
python -m crypto_insight_mcp.rag.ingest
# Run the offline test suite.
pytestConnect to Claude Desktop
Add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"crypto-insight": {
"command": "crypto-insight-mcp",
"env": {
"CIM_CHROMA_DIR": "/absolute/path/to/crypto-insight-mcp/.chroma"
}
}
}
}If crypto-insight-mcp is not on Claude Desktop's PATH, use the absolute path
to the script (which crypto-insight-mcp) or
"command": "python", "args": ["-m", "crypto_insight_mcp.server"] with the
right interpreter. Restart Claude Desktop; then try:
What are BTC and ETH trading at? Then check what our listing policy says about delisting notice periods.
Run the REST gateway
uvicorn crypto_insight_mcp.api:app --reload
# http://127.0.0.1:8000/docs — OpenAPI UI
# GET /health
# GET /prices?symbols=BTC,ETH&vs=usd
# POST /portfolio/analyze {"holdings": {"BTC": 0.5, "ETH": 10}}
# GET /knowledge/search?q=custody%20segregation&k=4Or with Docker:
docker compose up --build api # ingests on start, serves on :8000Run the agent demo (human-in-the-loop)
# Offline scripted mode — no LLM, no keys (needs internet for CoinGecko):
python agent_demo/demo.py "0.5 BTC, 10 ETH, 5000 USDT"
# Real tool-use loop through the Anthropic API:
pip install -e ".[agent]"
export ANTHROPIC_API_KEY=... # see .env.example
python agent_demo/demo.py "0.5 BTC, 10 ETH, 5000 USDT" --llmThe demo walks the agent workflow — prices → portfolio analysis → knowledge-base grounding → draft risk note — and then stops for human approval before "executing" the proposed action (execution is simulated; nothing is ever traded or sent).
Responsible AI & guardrails
Input validation at every tool boundary — symbols, query text, day ranges and holdings are validated and normalised; violations return messages that tell the LLM what was wrong and what acceptable values look like, so the agent can self-correct instead of retry-looping.
Rate limiting — a thread-safe token bucket in front of CoinGecko keeps a misbehaving agent from hammering a third-party API.
Mandatory disclaimers — every analytical payload carries
"Informational market data / document retrieval only. This is NOT financial, investment, legal or tax advice."The server's MCP instructions direct clients to surface it.No stack traces in model context — upstream failures map to short, safe
MarketDataErrormessages; tool handlers convert all handled errors to structured{"error": ...}payloads, so the server never crashes on bad input.Human-in-the-loop — the agent demo requires explicit approval before any consequential action; the default answer is "no".
Retrieved chunks, not synthesized answers —
search_knowledgereturns sourced chunks and leaves synthesis to the client LLM (ADR-0003).
Testing
The suite runs fully offline: CoinGecko is mocked with
httpx.MockTransport, embeddings use a deterministic hash fallback, Chroma
lives in per-test temp directories, and the MCP surface is exercised
in-process (mcp.list_tools() / mcp.call_tool()).
pytest # 64 tests, ~1.5 s
ruff check . # lintCI (GitHub Actions) runs lint + tests on every push and pull request with no secrets configured — by design.
Project layout
src/crypto_insight_mcp/
├── server.py # MCP transport (FastMCP, stdio)
├── api.py # REST transport (FastAPI)
├── services.py # domain logic shared by both
├── guardrails.py # validation, rate limiting, disclaimers
├── market/client.py # CoinGecko client: TTL cache, rate limit
└── rag/ # embeddings (ONNX + offline fallback), ingest, search
knowledge_base/ # sample corpus: MiCA, AML/KYC, custody, listing policy
agent_demo/demo.py # human-in-the-loop agent scenario (offline + --llm)
docs/ # architecture.md + ADRs
tests/ # offline test suiteRoadmap
Pinecone/managed vector-store adapter behind the existing LangChain interface (the embedded-Chroma trade-off is documented in ADR-0002).
Kubernetes manifests for the REST gateway.
Retrieval evaluation harness (golden questions → recall/precision on the knowledge base) to make RAG quality measurable, not anecdotal.
Symbol resolution fallback via CoinGecko
/searchfor long-tail assets.
Author
Igors Abramovs — github.com/IgorAbramov
MIT License — see LICENSE.
Available Tools
4 toolsanalyze_portfolioA
Value a portfolio and flag concentration risk (informational only).
Args: holdings: Mapping of ticker symbol to amount held, e.g. {"BTC": 0.5, "ETH": 10}. Max 50 positions. vs_currency: Quote currency (default "usd").
Returns total value, per-position allocation percentages, the HHI concentration index and warnings. No investment recommendations.
Inputs: holdings (required), vs_currency.
get_market_historyA
Get daily price history for a symbol plus min/max/change statistics.
Args: symbol: Single ticker symbol, e.g. "BTC". days: Look-back window in days, 1..365 (default 30). vs_currency: Quote currency (default "usd").
Inputs: symbol (required), days, vs_currency.
get_priceA
Get current spot price and 24h change for one or more ticker symbols.
Args: symbols: Ticker symbols, e.g. ["BTC", "ETH"]. Max 25 per call. vs_currency: Quote currency (default "usd").
Inputs: symbols (required), vs_currency.
search_knowledgeA
Semantic search over the internal knowledge base (MiCA, AML/KYC, custody, listing).
Args: query: Natural-language question or keywords, max 500 characters. k: Number of chunks to retrieve, 1..10 (default 4).
Returns retrieved chunks with source and snippet — synthesise the
answer yourself and cite the sources.
Inputs: query (required), k.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool targets a distinct function: price quotes, historical data, portfolio analysis, and knowledge retrieval. No overlapping purposes.
All tool names follow a consistent verb_noun snake_case pattern (get_price, get_market_history, analyze_portfolio, search_knowledge), making them predictable.
Four tools cover the core features of a crypto insight server without being excessive. Could potentially include one or two more for deeper analysis, but the count is reasonable.
The tool set covers common needs: price, history, portfolio valuation, and knowledge base. Minor gaps like market cap or news are absent but not critical for the stated purpose.
Related MCP Connectors
Your agent needs crypto prices it can rely on — spot, ranked market tables, history, OHLC, per-venue tickers, and what is trending right now. **What you can ask for** • "What is the price of these 20 tokens in USD and EUR right now?" • "Give me the top 100 by market cap with 24h and 7d change." • "Chart this coin's price over the last year, hourly." • "Where does this token trade, and at what spread per venue?" • "What is trending on CoinGecko today?" **How to use it** Point any MCP client at https://mcp.aisa.one/crypto-market-data/mcp and sign in with OAuth — there is no key to create or paste. 21 CoinGecko tools: simple price and token price by contract, supported currencies, coin list and detail, ranked markets, history, market charts and ranges, OHLC, per-coin tickers, categories, exchanges and their tickers, token data and charts, and trending. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Price the token here, then ask the same agent what X is posting about it — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/finance/mcp for equities, crypto and prediction markets in one place.
MCP server for querying Forkast documentation
MCP server for Gainium — manage trading bots, deals, and balances via AI assistants
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceA Model Context Protocol (MCP) server that provides comprehensive cryptocurrency analysis using the CoinCap API. This server offers real-time price data, market analysis, and historical trends through an easy-to-use interface. Updated to use Coin Cap API v3350 npm1MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides cryptocurrency project data to AI agents11MIT
- AlicenseAqualityDmaintenanceA portfolio analysis MCP server that enables AI agents to manage investment portfolios, fetch financial data from Yahoo Finance and CoinGecko, and perform advanced analysis like weight optimization and Monte Carlo simulations. It utilizes reference-based caching to efficiently handle large datasets without bloating the LLM's context window.261MIT
- AlicenseAqualityDmaintenanceA comprehensive cryptocurrency market-data MCP server with 49 tools across six data sources, enabling LLMs to answer market questions via natural language.49MIT