mcp-solid-pod
by memori-ai
README.md
# mcp-solid-pod
MCP server for [Solid](https://solidproject.org/) Pods — list, read, search, and (opt-in) write — with **CSS client-credentials** auth for headless use (AIsuru MCP Gateway, Claude Desktop, etc.).
Portions adapted from [`@jeswr/solid-mcp`](https://github.com/jeswr/solid-mcp) (MIT).
## Requirements
- **Node.js >= 24**
- A Solid server that supports client credentials (e.g. [Community Solid Server](https://communitysolidserver.github.io/CommunitySolidServer/latest/))
## Tools
| Tool | Args | Notes |
| -------------- | ------------------------------- | ------------------------------------------------ |
| `solid_list` | `{ container }` | List LDP container children |
| `solid_read` | `{ url }` | Read resource (Turtle for RDF) |
| `solid_search` | `{ query, scope? }` | Client-side search |
| `solid_write` | `{ url, content, contentType }` | PUT — disabled unless `SOLID_MCP_READONLY=false` |
All URLs are confined to `SOLID_MCP_POD_ROOT` (SSRF / pod-scope guard).
## Environment
| Variable | Required | Description |
| ------------------------- | ---------------- | ---------------------------------------- |
| `SOLID_MCP_POD_ROOT` | yes | Pod/container URL ending in `/` |
| `SOLID_MCP_OIDC_ISSUER` | for private pods | IdP base (e.g. `http://localhost:3000/`) |
| `SOLID_MCP_CLIENT_ID` | for private pods | CSS client credentials id |
| `SOLID_MCP_CLIENT_SECRET` | for private pods | CSS client credentials secret |
| `SOLID_MCP_WEBID` | no | Enables Type-Index search hints |
| `SOLID_MCP_READONLY` | no | Default `true` |
Credentials are read from the environment only (gateway `server_parameters`) — never from the LLM.
## Local run
```sh
npm install
npm run build
npm test
SOLID_MCP_POD_ROOT=http://localhost:3000/alice/ \
SOLID_MCP_OIDC_ISSUER=http://localhost:3000/ \
SOLID_MCP_CLIENT_ID=… \
SOLID_MCP_CLIENT_SECRET=… \
node build/cli.js
```
## E2E against Community Solid Server
```sh
npm run build
npm run e2e
```
This starts `npx @solid/community-server` with [`e2e/seed.json`](e2e/seed.json), creates client credentials, and asserts list/read/search/write via the MCP stdio client.
With Docker instead:
```sh
docker compose -f e2e/docker-compose.yml up -d
SKIP_CSS_START=1 npm run e2e
docker compose -f e2e/docker-compose.yml down
```
## Configure in the AIsuru MCP Gateway UI (admin)
Gateway admin → **MCP Server Schemas** → **Nuovo schema**. Fill the form with the values below (copy-paste).
### Informazioni base
| Field | Value |
| ------------------------------------------------- | --------------------------------- |
| **ID Schema** | `solid-pod-mcp-server` |
| **Nome** | `Solid Pod` |
| **Tipo Server** | `Server MCP Generico` (`generic`) |
| **Logo/Emoji** | `🌐` |
| **Comando/URL di Esempio** (`url_command_hidden`) | `npx -y @memori.ai/mcp-solid-pod` |
| **Priorità** | `16` |
| **Schema disponibile** | checked |
Local unpublished package (dev gateway host):
```text
node /absolute/path/to/MCP Solid/build/cli.js
```
### Descrizioni
**🇮🇹 Descrizione Italiana**
```text
Server MCP per leggere e (opzionalmente) scrivere dati in un Solid Pod tramite LDP/RDF. Autenticazione headless con client credentials CSS / Solid-OIDC. Le credenziali non sono mai passate al LLM.
```
**🇺🇸 English Description**
```text
MCP Server to read and (optionally) write data in a Solid Pod via LDP/RDF. Headless auth with CSS / Solid-OIDC client credentials. Credentials are not given to the LLM.
```
### Prompt per Agenti AI
**Prompt per Lista Tools**
```text
Questo server Solid Pod permette di elencare, leggere e cercare risorse LDP/RDF nel pod configurato. Questa funzione permette di leggere la lista di tool disponibili per questo MCP.
```
**Prompt per Esecuzione Tools**
```text
Usa solid_list per esplorare un container (URL che termina con /), solid_read per leggere una risorsa, solid_search per cercare per nome/URL/letterali RDF. solid_write e' disponibile solo se SOLID_MCP_READONLY=false. Tutti gli URL devono stare dentro SOLID_MCP_POD_ROOT.
```
### Parametri (JSON) — paste into “Parametri di Configurazione”
```json
[
{
"name": "SOLID_MCP_POD_ROOT",
"type": "string",
"required": true,
"description": "URL assoluto del pod/container (deve terminare con /)",
"description_it": "URL assoluto del pod/container (deve terminare con /)",
"description_en": "Absolute pod/container URL (must end with /)",
"example": "https://pod.example/alice/"
},
{
"name": "SOLID_MCP_OIDC_ISSUER",
"type": "string",
"required": true,
"description": "Base URL dell'Identity Provider / CSS (es. https://pod.example/)",
"description_it": "Base URL dell'Identity Provider / CSS (es. https://pod.example/)",
"description_en": "Identity Provider / CSS base URL (e.g. https://pod.example/)",
"example": "https://pod.example/"
},
{
"name": "SOLID_MCP_CLIENT_ID",
"type": "string",
"required": true,
"description": "Client credentials ID (CSS)",
"description_it": "Client credentials ID (CSS)",
"description_en": "Client credentials ID (CSS)",
"example": "my-token_xxxxxxxx"
},
{
"name": "SOLID_MCP_CLIENT_SECRET",
"type": "string",
"required": true,
"description": "Client credentials secret (CSS)",
"description_it": "Client credentials secret (CSS)",
"description_en": "Client credentials secret (CSS)",
"example": "your-client-secret"
},
{
"name": "SOLID_MCP_WEBID",
"type": "string",
"required": false,
"description": "WebID del proprietario (abilita Type-Index in search)",
"description_it": "WebID del proprietario (abilita Type-Index in search)",
"description_en": "Owner WebID (enables Type-Index hints in search)",
"example": "https://pod.example/alice/profile/card#me"
},
{
"name": "SOLID_MCP_READONLY",
"type": "boolean",
"required": false,
"description": "Se true (default) disabilita solid_write",
"description_it": "Se true (default) disabilita solid_write",
"description_en": "If true (default) disables solid_write",
"example": "true",
"default": "true"
}
]
```
Click **Crea Schema**.
### When an agent activates this MCP
Fill instance parameters with real values (injected as env vars; never sent to the LLM):
```json
{
"SOLID_MCP_POD_ROOT": "https://pod.example/alice/",
"SOLID_MCP_OIDC_ISSUER": "https://pod.example/",
"SOLID_MCP_CLIENT_ID": "my-token_xxxxxxxx",
"SOLID_MCP_CLIENT_SECRET": "the-secret-value",
"SOLID_MCP_WEBID": "https://pod.example/alice/profile/card#me",
"SOLID_MCP_READONLY": "true"
}
```
`SOLID_MCP_CLIENT_SECRET` is encrypted at rest.
## License
MIT — see [LICENSE](LICENSE).
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues