crypto-transactions-mcp
MCP server for tracking crypto transactions (trades, swaps, transfers) with exact Decimal precision, allowing LLM agents to log and query historical records with JSON or Notion persistence.
README
crypto-transactions-mcp
MCP server per tracciare transazioni e ordini eseguiti nel mercato crypto.
Espone tool MCP che permettono a un agent LLM (Claude, agy, ecc.) di
registrare trade, swap e trasferimenti con precisione Decimal esatta, e di
interrogare lo storico — con persistenza intercambiabile su un file JSON
locale o su un database Notion.
Quick Start
uv syncper installare le dipendenze.- Scegli un backend:
- JSON (default, zero config) — salta al punto 3.
- Notion — segui prima la sezione "Setup Notion da zero" qui sotto.
- Aggiungi il server alla configurazione del tuo host MCP: vedi "Configurazione Claude Desktop" o "Configurazione agy".
- Riavvia l'host e prova, ad esempio: "Ho comprato 0.1 BTC su Binance a 65000 USDT, fee 0.0001 BTC, registralo con log_transaction."
Architettura onion:
domain/— entitàCryptoTransaction(Pydantic v2, campi monetari inDecimal).sideèBUY/SELL(trade, incluso uno swap crypto/crypto) oppureTRANSFER(spostamento dello stesso asset tra due custodie); i due casi hanno requisiti diversi validati nel modello stesso (BUY/SELL richiedonoprice/value, TRANSFER richiedeto_exchange)interfaces/— portTransactionRepositoryeTransactionFiltersusecases/—LogTransactionUseCase(trade, upsert con merge parziale),LogTransferUseCase(transfer, stessa semantica di upsert),GetTransactionHistoryUseCaseinfrastructure/— adapter concreti del portTransactionRepository:JsonTransactionRepository, file JSON locale, path fissodata/crypto_transactions.jsonNotionTransactionRepository, database Notion (vedi sotto)
delivery/— serverFastMCP, tool MCP (log_transaction,log_transfer,get_transaction_history), wiring delle dipendenze infactories.py
Tool MCP
log_transaction— trade BUY/SELL, incluso uno swap tra due crypto (es. ETH/BTC): stessa forma di un trade normale, non serve un tool a parte. Supportafiat_value/fiat_currencyopzionali per fissare il controvalore fiat al momento dello scambio — fortemente consigliato per gli swap crypto/crypto, dove il soloprice(cambio relativo tra le due crypto) non permette di calcolare a posteriori il P&L realizzato né il cost-basis fiat del nuovo asset ricevuto.log_transfer— spostamento dello stesso asset tra due custodie (exchange→to_exchange), non un trade: nienteside/price, ma richiedeto_exchange.get_transaction_history— storico di entrambi, con filtri opzionali (symbol,exchange,sideincluso"TRANSFER",date_from/date_to).
Setup
uv sync
Copia .env.example in .env e valorizzalo: viene caricato automaticamente
all'avvio (main.py chiama load_dotenv()). Questo funziona anche quando il
server è lanciato da un host esterno (Claude Desktop, agy, ...) con
uv run --directory <path> main.py, perché --directory imposta la working
directory del processo sulla root del progetto, dove load_dotenv() cerca
.env di default — non serve duplicare i secret nel JSON di config
dell'host, che spesso è meno protetto di un .env locale gitignored.
Backend di persistenza
Selezionabile con la variabile d'ambiente TRANSACTION_REPOSITORY_BACKEND:
json(default) — nessuna configurazione aggiuntiva richiesta.notion— richiedeNOTION_TOKEN(token dell'integration Notion) eNOTION_DATABASE_ID.
Setup Notion da zero
Se non hai già un'integration Notion collegata a questo progetto, segui questi passi in ordine (richiede un account Notion con permessi di creare integration nel workspace):
- Crea l'integration — vai su notion.so/my-integrations → "+ New integration" → dai un nome (es. "Crypto Transactions MCP") → scegli il workspace → tipo "Internal".
- Abilita le capabilities — nella pagina di configurazione dell'integration, sotto "Capabilities", abilita: Read content, Update content, Insert content.
- Copia il token — tab "Secrets" → copia il valore di "Internal
Integration Secret" (inizia con
secret_ontn_). Questo è il tuoNOTION_TOKEN. - Crea il database — in Notion, crea un nuovo database (full-page o
inline) e configuralo con esattamente le property elencate nella tabella
sotto. La colonna "title" che Notion crea di default (di solito "Name")
va rinominata in
Transaction ID: ogni database Notion ne ha obbligatoriamente una, non è il nome del database ma la colonna che identifica ogni riga. - Condividi il database con l'integration — apri la pagina del database → menu "..." in alto a destra → "Connections" → cerca e collega l'integration creata al punto 1. Senza questo passaggio l'API risponde 404 anche con un token valido, perché i permessi Notion sono per-pagina, non workspace-wide.
- Trova il database ID — è nell'URL della pagina del database:
https://www.notion.so/<ID-senza-trattini>?v=.... Ad esempio, dahttps://www.notion.so/abcdef0123456789abcdef0123456789?v=...l'ID èabcdef0123456789abcdef0123456789. Questo è il tuoNOTION_DATABASE_ID. - Configura le variabili — nel tuo
.env(vedi sopra), o nel bloccoenvdell'host MCP:TRANSACTION_REPOSITORY_BACKEND=notion NOTION_TOKEN=<il secret del punto 3> NOTION_DATABASE_ID=<l'id del punto 6>
Il database Notion deve avere queste property (nome esatto e tipo):
| Property | Tipo |
|---|---|
Transaction ID |
title |
Tx Hash |
rich_text |
Exchange |
select |
To Exchange |
select |
Symbol |
select |
Side |
select (BUY, SELL, TRANSFER) |
Timestamp |
date (con orario, UTC) |
Amount |
number |
Price |
number |
Value |
number |
Fee Amount |
number |
Fee Asset |
select |
Fiat Value |
number |
Fiat Currency |
select |
Notes |
rich_text |
To Exchange, Price, Value, Fiat Value, Fiat Currency possono essere
vuoti (non si applicano a un TRANSFER, o sono opzionali su un trade).
Nota: i campi numerici su Notion sono number nativi (float64), non Decimal
esatti come nel backend JSON — sufficiente per gli importi reali di trading,
ma soggetto ai limiti di precisione di un float a doppia precisione.
Test
uv run pytest
Esecuzione manuale
uv run main.py
Configurazione Claude Desktop
Aggiungi al file claude_desktop_config.json (su macOS:
~/Library/Application Support/Claude/claude_desktop_config.json). Con un
.env già configurato alla root del progetto (vedi sopra) basta questo,
nessun secret nel JSON:
{
"mcpServers": {
"crypto-transactions": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/crypto-transactions-mcp",
"main.py"
]
}
}
}
In alternativa, se preferisci non usare un file .env, puoi passare le
variabili direttamente nel blocco env (sovrascrivono quelle di .env se
presenti entrambe):
{
"mcpServers": {
"crypto-transactions": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/crypto-transactions-mcp",
"main.py"
],
"env": {
"TRANSACTION_REPOSITORY_BACKEND": "notion",
"NOTION_TOKEN": "secret_...",
"NOTION_DATABASE_ID": "abcdef0123456789abcdef0123456789"
}
}
}
}
Configurazione agy
Stesso schema mcpServers, ma nel file .agents/mcp_config.json alla root del
progetto in cui usi agy (aggiungi la voce crypto-transactions accanto agli
altri server già presenti, senza rimuoverli). Vale la stessa cosa: con .env
configurato non serve il blocco env:
{
"mcpServers": {
"crypto-transactions": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/crypto-transactions-mcp",
"main.py"
]
}
}
}
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。