mcp-sparql
by daedalus
README.md
**mcp-sparql** — MCP server exposing SPARQL query functionalities for LLMs.
[](https://pypi.org/project/mcp-sparql/)
[](https://pypi.org/project/mcp-sparql/)
[](https://github.com/astral-sh/ruff)
mcp-name: io.github.daedalus/mcp-sparql
## Install
```bash
pip install mcp-sparql
```
## Usage
### As an MCP Server
Add to your MCP configuration (e.g., `~/.config/claude/mcp.json`):
```json
{
"mcpServers": {
"mcp-sparql": {
"command": "mcp-sparql"
}
}
}
```
### Available Tools
| Tool | Description |
|------|-------------|
| `sparql_query` | Execute SPARQL SELECT queries (table or JSON output) |
| `sparql_ask` | Execute SPARQL ASK queries (boolean result) |
| `sparql_construct` | Execute SPARQL CONSTRUCT queries (Turtle or JSON-LD) |
| `sparql_describe` | Execute SPARQL DESCRIBE queries (Turtle or JSON-LD) |
| `sparql_validate` | Validate SPARQL query syntax without executing |
| `sparql_list_graphs` | List named graphs on a SPARQL endpoint |
| `sparql_get_prefixes` | Get common prefixes for a SPARQL endpoint |
### Examples
**Query Wikidata:**
```
sparql_query:
endpoint: "https://query.wikidata.org/sparql"
query: "SELECT ?item ?itemLabel WHERE { ?item wdt:P31 wd:Q5 . ?item rdfs:label ?itemLabel . FILTER(LANG(?itemLabel) = 'en') } LIMIT 5"
```
**Check if an entity exists:**
```
sparql_ask:
endpoint: "https://query.wikidata.org/sparql"
query: "ASK { wd:Q42 wdt:P31 wd:Q5 }"
```
**Validate a query:**
```
sparql_validate:
query: "SELECT ?s WHERE { ?s ?p ?o }"
```
**List named graphs:**
```
sparql_list_graphs:
endpoint: "https://query.wikidata.org/sparql"
```
**Get common prefixes:**
```
sparql_get_prefixes:
endpoint: "https://query.wikidata.org/sparql"
```
### Resources
| Resource | URI | Description |
|----------|-----|-------------|
| Common Prefixes | `sparql://common-prefixes` | Standard SPARQL namespace prefixes |
## API
### `sparql_query`
Execute a SPARQL SELECT query.
**Parameters:**
- `endpoint` (str): SPARQL endpoint URL
- `query` (str): SPARQL SELECT query
- `timeout` (int, default=30): Query timeout in seconds
- `output_format` (str, default="table"): "table" for Markdown, "json" for JSON
- `headers` (dict, optional): HTTP headers for authentication
- `max_rows` (int, default=1000): Maximum result rows
### `sparql_ask`
Execute a SPARQL ASK query. Returns "true" or "false".
### `sparql_construct`
Execute a SPARQL CONSTRUCT query. Returns RDF triples.
**Additional parameters:**
- `output_format` (str, default="turtle"): "turtle" or "json"
### `sparql_describe`
Execute a SPARQL DESCRIBE query. Returns RDF description.
### `sparql_validate`
Validate SPARQL query syntax without executing.
### `sparql_list_graphs`
List available named graphs on a SPARQL endpoint.
### `sparql_get_prefixes`
Get commonly used prefixes for a SPARQL endpoint.
## Development
```bash
git clone https://github.com/daedalus/mcp-sparql.git
cd mcp-sparql
pip install -e ".[test]"
# run tests
pytest
# format
ruff format src/ tests/
# lint + type check
prospector --with-tool ruff --with-tool mypy --with-tool pylint src/
```
TDQS
A4.1/5.0
Scored across 7 tools
Disambiguation5/5
Each tool targets a distinct SPARQL operation (ASK, CONSTRUCT, DESCRIBE, SELECT, validate, get prefixes, list graphs) with no overlap. An agent can easily distinguish between them.
Naming Consistency5/5
All tools follow a consistent 'sparql_<verb_or_noun>' pattern, using snake_case throughout. This makes the tool set predictable and easy to navigate.
Tool Count5/5
7 tools is well-scoped for a SPARQL server, covering all major query forms and common utilities without overloading. Each tool serves a clear purpose.
Completeness4/5
The set covers the four main SPARQL query types (SELECT, CONSTRUCT, ASK, DESCRIBE) plus validation, prefix retrieval, and graph listing. Missing SPARQL UPDATE operations, but read-only coverage is strong for typical use.
Maintenance
ActivityInactive
ResponsivenessNo issues