MCP server

Ask ExpoPortal questions in plain language from your AI assistant. It answers by querying the SPARQL endpoint live.

The approach: MCP over SPARQL

The Model Context Protocol (MCP) lets an AI assistant call tools on a server. This server gives the assistant read-only access to the ExpoPortal SPARQL endpoint: it writes the queries itself and answers from live data, not from what it remembers.

Your AI assistant Writes SPARQL, reads the advice, retries
→
MCP server Schema card, ontology lookup, guardrails
→
SPARQL endpoint Live ExpoPortal data

SPARQL against ExpoPortal is easy to get wrong: fields that look like Dublin Core are OMV here, metadata is split across named graphs, and a query against the wrong graph returns zero rows with no error. So the server does more than pass queries through. It gives the assistant:

  • A schema card: every metadata graph with all its predicates, the graph layout and worked query patterns.
  • Ontology lookup, so a name or acronym resolves to the real IRI and current content instead of a guess.
  • Guarded execution. Writes are refused, result sizes are capped, and every failure or empty result comes back with advice on how to repair the query.

Why not retrieval (RAG)? The data here is highly structured: typed records in named graphs, linked by a fixed set of predicates. Questions about it are answered by exact joins, filters and counts, which SPARQL computes and similarity search cannot. And the vocabulary that matters, about 200 predicates across 13 graphs, fits in the assistant's context: retrieval over something that already fits can only lose the predicate it needed. The mistakes that actually happen (invented predicates, the wrong graph, queries too expensive for the endpoint) are fixed by a complete predicate list, ontology lookup, guardrails and a repair loop.

Questions to try

Each one targets a mistake AI assistants commonly make on ExpoPortal.

Size and the current version

In ExpoPortal, which ontologies have the most classes, counting only their current version?
Sizes live in the Metrics graph, not in omv:numberOfClasses. Only the current version counts, and metric values must be sorted as numbers.

Content

In ExpoPortal, what are the ancestors of the class "Plant" in the Semantic Types Ontology (STY), up to the root?
Reads the ontology's own content graph, which has to be resolved first, then walks rdfs:subClassOf upwards.
In ExpoPortal, find classes whose label mentions "exposure", with the ontology each one comes from.
A label search across every ontology's content, not just one; labels can be skos:prefLabel or rdfs:label.

Categories, groups and licenses

In ExpoPortal, list each ontology with the version and license of its current submission.
Version and license sit on the submission, not on the ontology record, and only the current submission counts.

Mappings

In ExpoPortal, how many mappings are there between each pair of ontologies?
Uses the per-pair mapping counts instead of counting term pairs, and keeps only ontologies that still exist.

Missing data and failed versions

In ExpoPortal, which ontologies have no license in their current version?
An absent field, without borrowing an archived version's license.
In ExpoPortal, which ontologies have a version that failed to parse?
The version status, which the worked query patterns barely cover.

Server URL

https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
Streamable HTTP transport. No account or API key needed.

Set it up

Add the server URL to your MCP client. Clients that load servers at startup need a restart.
Claude Code
claude mcp add --transport http expoportal https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
claude mcp add --transport http expoportal https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
opencode
opencode mcp add expoportal --url https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
opencode mcp add expoportal --url https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp
VS Code, in .vscode/mcp.json
{ "servers": { "expoportal": { "type": "http", "url": "https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp" } } }
{
  "servers": {
    "expoportal": {
      "type": "http",
      "url": "https://expoportal.biohackeu.bigcat-bioinformatics.org/mcp"
    }
  }
}
Claude (web and desktop apps)
Settings → Connectors → Add custom connector, then paste the server URL.
Other clients
Any client that supports the Streamable HTTP transport works. Use the server URL, with no authentication.

Tools

get_schema_card Every metadata graph with its predicates and usage counts, the graph layout, categories, groups and worked query patterns.
resolve_ontology An ontology name or acronym → its IRI and the named graph holding its current content.
run_sparql Read-only, guarded execution. Returns rows, or a failure with repair advice.
list_terms The subject categories or groups, with their IRIs.
Each tool call, including the query, is logged to improve the service. No IP address or account is recorded.