A composable RDF operations system that translates natural language instructions into JSON-formatted domain-specific language operations for loading, querying, and writing RDF Linked Data.
This system implements generic operations for RDF Linked Data and SPARQL management, as well as some LinkedDataHub-specific operations. Operations can be consumed in two ways:
- Executable JSON format: Operations are composed into JSON structures and executed by the provided execution engine
- Model Context Protocol (MCP): Operations are exposed as tools for AI agents to use interactively
See WebAlgebra in action - translating natural language into RDF operations.
The system is built around the Operation
abstract base class that provides:
- Registry System: Auto-discovery of operations from
src/web_algebra/operations/
- JSON DSL: Operations use
@op
key withargs
for parameters, supporting nested operation calls - Execution Engine: Both standalone execution and MCP server integration
- Context System: ForEach operations set row context for inner operations
- System Prompt: Complete operation definitions and JSON format specification
- Operation Interface: Base class and JSON interpreter
- Operation Implementations: Directory containing all available operations
- JSON Examples: Sample operation compositions
The operations cover read-write Linked Data, SPARQL queries, and LinkedDataHub-specific resource creation. Non-exhaustive list:
- Linked Data
GET
PATCH
POST
PUT
- SPARQL
CONSTRUCT
DESCRIBE
SELECT
- LinkedDataHub-specific
CreateContainer
CreateItem
List
AddGenericService
AddResultSetChart
AddSelect
AddView
- Install uv
-
uv venv uv sync
uv run python src/web_algebra/main.py
Then enter instruction, for example:
Select random 10 UK cities from DBpedia
See more examples
Currently requires OpenAI API access. OPENAI_API_KEY
env value has to be set.
uv run python src/web_algebra/main.py --from-json ./examples/substitute-test.json
See JSON examples.
With LinkedDataHub
- Run LinkedDataHub v5
- Execute
src/web_algebra/main.py
, it expects the path to your LDH's owner certificate and its password as arguments. For example:
uv run python src/web_algebra/main.py --from-json ./examples/united-kingdom-cities.json \
--cert_pem_path ../LinkedDataHub/ssl/owner/cert.pem \
--cert_password **********
Here and throughout this guide, the client certificate/password arguments are only required for authentication with LinkedDataHub. You don't need them if you're not using LinkedDataHub with Web Algebra.
uv run python -m web_algebra
uv run uvicorn web_algebra.server:app --reload
or with LinkedDataHub certificate credentials (change the path and password to yours):
CERT_PEM_PATH="/Users/Martynas.Jusevicius/WebRoot/LinkedDataHub/ssl/owner/cert.pem" CERT_PASSWORD="********" uv run uvicorn web_algebra.server:app --reload
MCP Inspector configf
You can the inspector like this:
npx @modelcontextprotocol/inspector
and then open on the URL printed in its console output, for example:
http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=b31e4b3d852b5a2445f45032c484e54e319bf16359585858cf88fe9a90816744
The MCP_PROXY_AUTH_TOKEN
is required. If the link does not appear, you need to copy the session token from the console and paste it into inspector's Proxy Session Token config.
Web Algebra's settings:
Claude Desktop tool config
Add Web Algebra entry (that uses stdio transport) to the mcpServer
configuration your claude_desktop_config.json
file:
{
"mcpServers": {
"Web Algebra": {
"command": "uv",
"args": [
"--directory",
"/Users/Martynas.Jusevicius/WebRoot/Web-Algebra/src",
"run",
"--with",
"mcp[cli]",
"--with",
"rdflib",
"--with",
"openai",
"python",
"-m",
"web_algebra"
],
"env": {
"CERT_PEM_PATH": "/Users/Martynas.Jusevicius/WebRoot/LinkedDataHub/ssl/owner/cert.pem",
"CERT_PASSWORD": "********"
}
}
}
}
Leave the command as it is. Those uv run --with
arguments are important, otherwise 3rd party packages cannot be found.
On my Mac, the path to uv
has to be absolute, otherwise it doesn't work in Claude Desktop 🤷♂️.
CERT_PEM_PATH
and CERT_PASSWORD
env values are optional.