A Model Context Protocol server for IPFS operations
Give Claude full control over the InterPlanetary File System
Quick Start β’ Features β’ Tools β’ Configuration β’ Architecture β’ Contributing
MCP-IPFS is a Model Context Protocol (MCP) server that enables Claude and other AI assistants to interact directly with IPFS (InterPlanetary File System). It provides a comprehensive suite of tools for content-addressed storage, peer-to-peer networking, and decentralized data management.
Built on Helia (the modern JavaScript IPFS implementation), with a pluggable architecture ready for Kubo and remote pinning services.
| Without MCP-IPFS | With MCP-IPFS |
|---|---|
| Manual IPFS CLI commands | Claude handles IPFS operations directly |
| Copy-paste CIDs between tools | Seamless content-addressed workflows |
| No visibility into node status | Full observability of peers, bandwidth, DHT |
| Long operations block interaction | Background jobs with progress tracking |
| Single IPFS backend | Pluggable: Helia, Kubo, pinning services |
- Node.js 18+
- Claude Code CLI or any MCP-compatible client
# Clone the repository
git clone https://github.com/EricGrill/mcp-ipfs.git
cd mcp-ipfs
# Install dependencies
npm install
# Build
npm run buildAdd to your ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"ipfs": {
"command": "node",
"args": ["/path/to/mcp-ipfs/dist/index.js"]
}
}
}You: What's the IPFS node status?
Claude: [Uses node_status tool]
Node is running with peer ID QmXxx...
Connected to 12 peers
Repository size: 45.2 MB
|
|
|
|
| Tool | Description |
|---|---|
ipfs_add |
Add text, JSON, or file to IPFS. Returns CID. |
ipfs_get |
Retrieve content by CID |
ipfs_pin |
Pin content to prevent garbage collection |
ipfs_unpin |
Unpin content |
ipfs_pins_list |
List all pinned CIDs |
ipfs_add_directory |
Add entire directory, returns root CID |
ipfs_ls |
List contents of directory CID |
ipfs_get_file |
Get specific file from directory by path |
| Tool | Description |
|---|---|
ipns_publish |
Publish CID to IPNS name |
ipns_resolve |
Resolve IPNS name to current CID |
ipns_keys_list |
List available IPNS keys |
| Tool | Description |
|---|---|
mfs_write |
Write content to mutable path |
mfs_read |
Read content from MFS path |
mfs_ls |
List directory contents |
mfs_mkdir |
Create directory |
mfs_rm |
Remove file or directory |
mfs_mv |
Move/rename file or directory |
mfs_flush |
Flush MFS to get root CID |
| Tool | Description |
|---|---|
dag_put |
Store IPLD data, returns CID |
dag_get |
Retrieve IPLD node, optionally traverse path |
| Tool | Description |
|---|---|
node_id |
Get peer ID, public key, versions |
node_status |
Quick health check |
node_version |
Detailed version info |
peers_list |
Connected peers with details |
peers_count |
Simple peer count |
bandwidth_stats |
Network bandwidth metrics |
swarm_connect |
Connect to peer by multiaddr |
swarm_disconnect |
Disconnect from peer |
repo_stats |
Repository statistics |
repo_gc |
Trigger garbage collection |
| Tool | Description |
|---|---|
dht_find_peer |
Find addresses for peer ID via DHT |
dht_find_providers |
Find peers providing a CID (configurable limit) |
dht_provide |
Announce content availability to the network |
| Tool | Description |
|---|---|
job_status |
Get status of background job |
jobs_list |
List all jobs |
job_cancel |
Cancel running job |
Create mcp-ipfs.config.json in the project root:
{
"backend": "helia",
"persistence": {
"enabled": true,
"path": "./ipfs-data"
},
"helia": {
"libp2p": {
"addresses": ["/ip4/0.0.0.0/tcp/4002"],
"bootstrap": true
}
},
"jobs": {
"maxConcurrent": 3,
"defaultTimeout": 300000
}
}Environment variables override config file settings:
| Variable | Description | Default |
|---|---|---|
MCP_IPFS_BACKEND |
Backend to use | helia |
MCP_IPFS_PERSISTENCE_ENABLED |
Enable persistent storage | true |
MCP_IPFS_DATA_PATH |
Data directory path | ./ipfs-data |
MCP_IPFS_BOOTSTRAP |
Connect to bootstrap nodes | true |
MCP_IPFS_JOBS_MAX_CONCURRENT |
Max concurrent jobs | 3 |
MCP_IPFS_JOBS_TIMEOUT |
Default job timeout (ms) | 300000 |
Persistent (default):
- Content survives server restarts
- Uses LevelDB blockstore
- Recommended for production
In-memory:
- Content lost on restart
- Faster for testing
- Set
persistence.enabled: false
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Claude β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββ
β MCP Protocol (JSON-RPC)
βββββββββββββββββββββββΌββββββββββββββββββββββββββββ
β MCP-IPFS Server β
β β
β βββββββββββββ βββββββββββββ βββββββββββββββ β
β β Content β β Node β β Job β β
β β Tools β β Tools β β Manager β β
β βββββββ¬ββββββ βββββββ¬ββββββ ββββββββ¬βββββββ β
β β β β β
β ββββββββββββββββΌββββββββββββββββ β
β β β
β βββββββββββββΌββββββββββββ β
β β Backend Layer β β
β β (IPFSBackend) β β
β βββββββββββββ¬ββββββββββββ β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββ
β
βββββββββββββββΌββββββββββββββ
βββββββΌβββββ βββββββΌβββββ βββββββΌβββββ
β Helia β β Kubo β β Pinning β
β(embedded)β β API β β Services β
ββββββββββββ ββββββββββββ ββββββββββββ
β planned planned
| Component | Responsibility |
|---|---|
| Content Tools | IPFS add/get/pin, IPNS, MFS, DAG operations |
| Node Tools | Status, peers, bandwidth, repo, DHT, config |
| Job Manager | Queue long operations, track progress, enable polling |
| Backend Layer | Abstract IPFS implementation details |
interface IPFSBackend {
// Lifecycle
start(): Promise<void>;
stop(): Promise<void>;
// Content
add(content: Uint8Array, options?: AddOptions): Promise<CID>;
get(cid: CID): Promise<Uint8Array>;
pin(cid: CID): Promise<void>;
unpin(cid: CID): Promise<void>;
// Node info
id(): Promise<PeerInfo>;
peers(): Promise<PeerConnection[]>;
// ... etc
}mcp-ipfs/
βββ src/
β βββ index.ts # Entry point
β βββ server.ts # MCP server setup
β βββ tools/
β β βββ content.ts # Content operations
β β βββ node.ts # Node monitoring
β β βββ jobs.ts # Job management
β βββ backends/
β β βββ interface.ts # Backend abstraction
β β βββ helia.ts # Helia implementation
β βββ jobs/
β β βββ manager.ts # Job queue
β βββ config.ts # Configuration
βββ test/
β βββ content.test.ts
β βββ node.test.ts
β βββ jobs.test.ts
βββ docs/
β βββ plans/ # Design documents
βββ package.json
βββ tsconfig.json
βββ mcp-ipfs.config.json
# Install dependencies
npm install
# Run in development mode
npm run dev
# Run tests
npm test
# Build for production
npm run build
# Lint
npm run lintContributions are welcome! Please read our contributing guidelines before submitting PRs.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License - see LICENSE for details.
- Protocol Labs for IPFS and Helia
- Anthropic for Claude and MCP
- The agents-skills-plugins marketplace for inspiration
Built with β€οΈ for the decentralized web