Pharos MCP Server
Enables querying Pharos blockchain data (EVM-compatible) through MCP, with read-only tools for blocks, transactions, balances, and contract calls, plus optional transaction broadcasting when self-hosted.
README
Pharos MCP Server
An MCP server that brings Pharos chain data into MCP-compatible IDEs and agent workflows — Claude Desktop, Cursor, Windsurf, and custom agent runners.
- Network: Pharos (EVM-compatible, 100% Ethereum-compatible)
- Chain ID:
1672(0x688) - RPC:
https://rpc.pharos.xyz - Native token: PROS
- Hosted endpoint:
https://mcp.pharos.xyz/mcp
Quick start — use the hosted server
No API key required. Add this to your MCP client configuration:
{
"mcpServers": {
"pharos": {
"type": "http",
"url": "https://mcp.pharos.xyz/mcp"
}
}
}
The hosted endpoint speaks Streamable HTTP, so your client must support remote MCP
servers. Clients that only support stdio can bridge with
mcp-remote:
{
"mcpServers": {
"pharos": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.pharos.xyz/mcp"]
}
}
}
Once connected, ask your agent things like "what's the latest Pharos block?" or "check the PROS balance of 0x…".
Rate limit: 120 requests per minute per IP. Exceeding it returns HTTP 429 with a
Retry-After header.
Tools
13 read-only tools are available today.
| Tool | Underlying JSON-RPC | Description | Parameters |
|---|---|---|---|
get_chain_info |
eth_chainId, eth_blockNumber, web3_clientVersion |
Chain ID, client version, latest block | — |
get_block_number |
eth_blockNumber |
Latest block height | — |
get_balance |
eth_getBalance |
Native PROS balance of an address | address, block? |
get_transaction_count |
eth_getTransactionCount |
Address nonce | address, block? |
get_gas_price |
eth_gasPrice, eth_maxPriorityFeePerGas |
Current gas price and priority fee | — |
get_block |
eth_getBlockByNumber |
Block by tag or number | block?, includeTransactions? |
get_transaction |
eth_getTransactionByHash |
Transaction by hash | hash |
get_transaction_receipt |
eth_getTransactionReceipt |
Transaction receipt | hash |
get_code |
eth_getCode |
Contract bytecode | address, block? |
get_storage_at |
eth_getStorageAt |
Read a contract storage slot | address, position, block? |
eth_call |
eth_call |
Read-only contract call | transaction, block? |
estimate_gas |
eth_estimateGas |
Estimate gas without sending | transaction |
get_logs |
eth_getLogs |
Event logs over a block range (max 5000 blocks per call) | address?, topics?, fromBlock?, toBlock? |
block accepts a named tag (latest, earliest, pending, safe, finalized), a
decimal number, or a 0x hex quantity.
Transaction broadcasting
A send_raw_transaction tool exists but is disabled on the hosted endpoint
(ENABLE_SEND_RAW_TRANSACTION=false), which is therefore read-only. Calling it there
returns an error.
The design is non-custodial: the server never receives or stores a private key. It only relays a transaction you already signed locally. If you self-host and enable it, put authentication in front of the endpoint first — an open, unauthenticated broadcast endpoint lets anyone push transactions through your node.
Self-hosting
Requires Node.js 20+.
npm install
npm run build
stdio transport
npm start
{
"mcpServers": {
"pharos": {
"command": "node",
"args": ["/absolute/path/to/pharos-mcp/dist/src/index.js"],
"env": {
"PHAROS_RPC_URL": "https://rpc.pharos.xyz",
"PHAROS_CHAIN_ID": "1672",
"PHAROS_NATIVE_SYMBOL": "PROS"
}
}
}
}
HTTP transport
MCP_TRANSPORT=http \
MCP_HOST=127.0.0.1 \
MCP_PORT=3001 \
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" \
npm start
- MCP endpoint:
http://127.0.0.1:3001/mcp(POST only) - Health check:
http://127.0.0.1:3001/health
With MCP_AUTH_TOKEN set, clients must send Authorization: Bearer <token>.
Scaling note. In HTTP mode each MCP session is held in the server process's memory. Running multiple instances behind a load balancer therefore needs real session affinity — and cookie-based stickiness is not enough, because MCP clients generally do not store or resend cookies. Requests that land on an instance which does not own the session fail with
Unknown MCP session. Run a single instance, or move session state into a shared store before scaling out.
Docker
docker build -t pharos-mcp-server .
docker run -p 3001:3001 -e MCP_TRANSPORT=http -e MCP_HOST=0.0.0.0 pharos-mcp-server
Configuration
| Variable | Default | Description |
|---|---|---|
PHAROS_RPC_URL |
https://rpc.pharos.xyz |
Upstream JSON-RPC endpoint |
PHAROS_CHAIN_ID |
1672 |
Expected chain ID |
PHAROS_NATIVE_SYMBOL |
PROS |
Native token symbol |
MCP_TRANSPORT |
stdio |
stdio or http |
MCP_HOST |
127.0.0.1 |
Bind address (use 0.0.0.0 in containers) |
MCP_PORT |
3001 |
HTTP port |
MCP_AUTH_TOKEN |
— | Bearer token; auth is off when unset |
ENABLE_SEND_RAW_TRANSACTION |
false |
Enable transaction broadcasting |
RATE_LIMIT_PER_MINUTE |
120 |
Per-IP request cap; 0 disables |
TRUST_PROXY |
false |
Set true when running behind exactly one trusted proxy (e.g. an ALB) so rate limiting uses the real client IP. Leave false if the server is directly reachable — otherwise clients can spoof X-Forwarded-For and evade the limiter |
MAX_SESSIONS |
500 |
Maximum concurrent MCP sessions; new sessions past the cap get 503. 0 disables the cap |
SESSION_TIMEOUT_MINUTES |
30 |
Idle sessions are evicted after this long |
Development
npm test # unit tests + a live chain ID check
npm run smoke # end-to-end MCP test over stdio against the real RPC
npm run smoke:http # end-to-end test against a running HTTP server
npm run smoke exercises the write path by signing a zero-value transaction with a freshly
generated empty wallet. The RPC rejects it for insufficient funds, so nothing is broadcast
on-chain.
Security notes
- Never pass a private key or mnemonic to this server; it has no use for one.
send_raw_transactionis disabled by default.- HTTP binds to
127.0.0.1by default. - For a public deployment, terminate TLS in front of the server and keep rate limiting on.
admin_*,debug_*,personal_*andtxpool_*methods are not exposed.
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.