MCP server for Solid 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 (MIT).
- Node.js >= 24
- A Solid server that supports client credentials (e.g. Community Solid Server)
| 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).
| 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.
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.jsnpm run build
npm run e2eThis starts npx @solid/community-server with e2e/seed.json, creates client credentials, and asserts list/read/search/write via the MCP stdio client.
With Docker instead:
docker compose -f e2e/docker-compose.yml up -d
SKIP_CSS_START=1 npm run e2e
docker compose -f e2e/docker-compose.yml downGateway admin → MCP Server Schemas → Nuovo schema. Fill the form with the values below (copy-paste).
| 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):
node /absolute/path/to/MCP Solid/build/cli.js
🇮🇹 Descrizione Italiana
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
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 Lista Tools
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
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.
[
{
"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.
Fill instance parameters with real values (injected as env vars; never sent to the LLM):
{
"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.
MIT — see LICENSE.