Skip to main content
Glama
UDAIBHAT

Fluree MCP Server

by UDAIBHAT
README.md
# Fluree MCP Server

A modern Node.js gateway that exposes [FlureeDB](https://flur.ee/) functionality through the **Model Context Protocol (MCP)**.  It combines a rich set of MCP tools, structured prompts, and session-aware routing so any LLM-powered client (IDE, chat, or custom app) can query, mutate, and manage a Fluree ledger safely and interactively.

---
## ✨ Key Features

| Category | Highlights |
|----------|------------|
| **MCP Tools** | 15+ tools: query, transact, block/block-range, history, network status, key generation, **schema management (create / update / validate / export / import)**, database diagnostics, echo |
| **Structured Prompts** | Every tool ships with a matching prompt template; clients discover via `prompts/list`, retrieve with `prompts/get`, and enjoy argument completion support |
| **Session Management** | First `initialize` call establishes a session & stores connection info (dbUrl, network, ledger) so subsequent requests are stateless for the client |
| **Validation & Safety** | All tool inputs validated with **Zod**; errors surfaced as JSON-RPC `-32602` or `-32603` |
| **Hot-Reload Friendly** | Tools & prompts registered dynamically; add new modules under `src/tools` or `src/prompts` and restart |
| **Extensible** | Written in ES Modules, small surface areaβ€”drop in new handlers, middlewares, or MCP capabilities |

---
## πŸ—‚οΈ Project Structure

```
src/
 β”œβ”€ config/            # Constant defaults & env helpers
 β”œβ”€ controllers/       # MCP server controller (session init, tool/prompt registration)
 β”œβ”€ routes/            # Express routes (`/api/v1/mcp`)
 β”œβ”€ tools/             # Individual MCP tools (each default export = { name, config, handler })
 β”œβ”€ prompts/           # Prompt templates mirrored one-to-one with tools
 └─ index.js           # Express bootstrap
.env.example           # Sample environment variables
README.md              # ← you are here
```

---
## πŸš€ Quick Start

1. **Clone & Install**
   ```bash
   git clone https://github.com/UDAIBHAT/Fluree_MCP_Server.git
   cd fluree-mcp-server
   npm install
   cp .env.example .env   # adjust DB connection defaults if desired
   ```

2. **Run**
   ```bash
   npm start   # serves http://localhost:3000
   ```

3. **Initialize a Session**
   ```jsonc
   POST http://localhost:3000/api/v1/mcp
   Headers: { "Content-Type":"application/json" }
   Body:
   {
     "jsonrpc":"2.0",
     "id":1,
     "method":"initialize",
     "params":{
       "dbUrl":"Your_DBurl",
       "network":"Your_Network",
       "ledger":"Your_Ledger"
     }
   }
   ```
   The response includes `mcp-session-id`β€”add it to all subsequent requests.

4. **Discover Tools & Prompts**
   ```jsonc
   { "jsonrpc":"2.0", "id":2, "method":"prompts/list", "params":{} }
   ```

---
## πŸ–₯️ IDE & Non-IDE Client Setup

### **IDE clients** 
```Cursor, Windsurf,Google Gemini . RooCode``` can add the server definition to their settings. Two examples are shown below – one for Cursor and one for Windsurf:
### CURSOR IDE
- Just insert this Patch of Json-code under the MCP-Section in the Cursor settings and you are good to go..... 
```jsonc
{
  "mcpServers": {
    "Fluree_MCP_Server": {
      "url": "http://localhost:3000/api/v1/mcp",  
      "headers": {
        "dburl": "Your_DBurl",
        "network": "Your_Network",
        "ledger": "Your_Ledger"
      }
    }
  }
}
```
### WINDSURF IDE
- Just insert this Patch of Json-code under the MCP-Section in the Windsurf Cascade settings and you are good to go.....
```jsonc
{
  "mcpServers": {
    "Fluree_MCP_Server": {
      "serverUrl": "http://localhost:3000/api/v1/mcp", 
      "headers": {
        "dbUrl": "Your_DBurl",
        "network": "Your_Network",
        "ledger": "Your_Ledger"
      }
    }
  }
}
```

### GOOGLE GEMINI
- Use the following JSON patch in your Gemini .settings ```[ Currently Gemini doesnt support Streamable HTTP transport]```

```jsonc
{
  "mcpServers": {
    "Fluree_MCP_Server": {
      "httpUrl": "http://localhost:3000/api/v1/mcp?dburl=<Your_DBurl>&network=<Your_Network>&ledger=<Your_Ledger>",
      "timeout": 30000,
      "trust": true
    }
  }
}
```

### **Non-IDE clients** 
Can simply POST to `/api/v1/mcp` (or `/mcp`) with a JSON body containing `dbUrl`, `network`, and `ledger` as shown in the Quick-Start initialization request.

---

## πŸ”§ Tools Overview

| Name | Purpose | Input Parameters |
|------|---------|------------------|
| `flureeQueryTool` | Select data via FlureeQL | `selectFields` (array\|"*"), `fromCollection` |
| `flureeTransact` | Create random collections | `count` (1-50) |
| `flureeSchemaCreate` | Create collection + predicates | `collectionName`, `predicates[]`, `doc?` |
| `flureeSchemaUpdate` | Update collection/predicates | `collectionName`, `updateType`, etc. |
| _…_ | _See `src/tools` for the rest_ | |

Each tool handler returns `{ content:[ {type:"text"|"json", text:string|object} ] }`, ready for LLM streaming.

---
## πŸ’¬ Prompt Workflow

1. **List**  β†’ `method:"prompts/list"`
2. **Get**   β†’ `method:"prompts/get"`, pass prompt `name` + `arguments` object
3. **(Optional) Suggest** β†’ `method:"completion/suggest"` for auto-complete while filling arguments

Prompts use Mustache-style placeholders (`{{argument}}`) inside user messages to instruct the assistant to call the correct tool.

---
## βš™οΈ Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `PORT` | `3000` | Server port |
| `FLUREE_DB_URL` | `http://localhost:8090` | Base Fluree URL |
| `FLUREE_NETWORK` | `test` | Default network |
| `FLUREE_LEDGER` | `demo` | Default ledger |

---
## πŸ“‘ API Collection

A ready-to-import Postman collection lives at `docs/postman/Fluree_MCP.postman_collection.json` (or generate it from the sample snippet in this README).

- You can also make a new collection with specified MCP endpoint ,postman supports the mcp endpoints so just inseret the server url then it will give you the whole list of tools. 

- Just Import the collection and call the ```Initialize_req``` this will make Initialization_Connection to the MCP_Server and you can also change the ```params``` like ```dbUrl,network,ledger```
- The mcp-session-id is dynamically stored in every request through Postman Post-Req Scripts



---
## πŸ›£οΈ Roadmap / Nice-to-Haves

- JWT authentication & role-based prompt permissions
- Rate limiting & CORS controls
- WebSocket support for real-time block watch
- Production observability: Prometheus exporter & Grafana dashboard
- Docker Compose bundle (Fluree + MCP + Grafana)

---
## πŸ“œ License

MIT Β© UDAI BHAT