High-performance MCP server for OWL ontology management, written in Rust
owl-mcp demonstrates solid definition quality with 18 well-structured tools, all with explicit schemas and descriptions. Tool naming follows verb_noun conventions (add_axiom, find_axioms, sparql_query). All parameters have type definitions and descriptions. However, several tools lack critical context about when to use them vs. alternatives, output schemas are not fully documented in visible code, and some parameter descriptions could be more prescriptive about constraints and formats. The server excels at domain-specific clarity (OWL/ontology operations are well-explained) but shows room for improvement in error recovery guidance and LLM-optimized descriptions.
Add an annotation assertion (AnnotationAssertion) where the literal VALUE is supplied as a separate field. Use this instead of add_axiom for long or special-character values (containing ; = / , quotes or newlines): the server constructs the axiom directly, so no escaping or shell-quoting is needed. property/subject accept an IRI, CURIE, or <full-iri>.
Add a single OWL axiom in functional syntax to the ontology file. E.g. SubClassOf(:Dog :Animal)
Add multiple OWL axioms in functional syntax to the ontology file. Stops on the first failure.
Add a class assertion (ClassAssertion) stating that an individual is an instance of a class. class/individual accept an IRI, CURIE, or <full-iri>.
Add a data property assertion (DataPropertyAssertion) where the literal VALUE is supplied as a separate field. Use this instead of add_axiom for long or special-character values (containing ; = / , quotes or newlines): the server constructs the axiom directly, so no escaping or shell-quoting is needed. property/subject accept an IRI, CURIE, or <full-iri>.
Tool descriptions lack LLM-optimized guidance on when to call each tool vs. alternatives. For example, add_axiom vs. add_data_property_assertion are distinguished only by implementation detail (escaping), not by user intent. Descriptions should explain: 'Use add_axiom when axiom is simple and no special characters; use add_data_property_assertion when the value contains newlines, quotes, or semicolons, no escaping needed.'
Output schemas are not explicitly documented in the visible tool definitions. While parameter input schemas are well-defined with JsonSchema derives, return types are inferred (Vec<String>) but not formally described to the LLM. Tools like test_quality and test_pitfalls promise JSON reports but the schema structure is not visible in tool metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | 2025-11-25+ | v1 |
Add an object property assertion (ObjectPropertyAssertion) linking a subject individual to a target individual via an object property. property/subject/target accept an IRI, CURIE, or <full-iri>.
Add a prefix mapping (e.g. prefix='ex:' uri='http://example.org/') to the ontology file.
Run an OWL 2 EL reasoner (whelk; alias elk) over one or more OWL files and report logical consistency. Reasoning is limited to the OWL 2 EL profile.
Search axioms in an OWL file using a regex pattern. Returns matching axioms (up to limit).
Return all axioms in the OWL file (up to limit).
Return all label values for a given IRI or CURIE in the ontology file. Defaults to rdfs:label.
Return the ontology-level annotation axioms (metadata header) for the given OWL file.
Remove a single OWL axiom (given in functional syntax) from the ontology file.
Set or update the ontology IRI (and optional version IRI) for an OWL file. Pass iri=null to clear the ontology IRI.
Run a SPARQL query over one or more OWL files. Returns SPARQL 1.1 JSON results for SELECT/ASK, and N-Triples for CONSTRUCT/DESCRIBE. Set with_reasoning=true to materialize OWL 2 EL entailments before querying.
Scan an OWL ontology for common modeling pitfalls (inspired by OOPS!). Returns a JSON report listing detected issues, their severity, and affected elements.
Evaluate the quality of an OWL ontology using the OQuaRE framework (based on ISO/IEC 25000 SQuaRE). Returns a JSON report with metrics, characteristics, and an overall 1-5 score.
Convert OWL axioms into Controlled Natural Language (pseudo-text) and a Turtle fragment. If iri is omitted, verbalizes owl:Class and owl:NamedIndividual entities (up to limit).
Error recovery guidance is missing from tool descriptions. When add_axiom fails (syntax error, file not found), the description does not guide the LLM toward recovery. Add: 'If parsing fails, check OWL functional syntax. If file not found, use absolute path or create file with add_prefix first.'
Parameter constraints are described in prose but not enforced via JSON Schema patterns or enums. For example, reasoner in check_consistency accepts 'whelk' or 'elk' but this is documented only in description text, not as an enum. LLMs cannot parse prose constraints, use formal schema.
Destructive operations (remove_axiom, overwriting via set_ontology_iri) lack confirmation or dry-run patterns. An agent could accidentally delete all axioms matching a regex in find_axioms and pass them to remove_axiom in a loop. Consider adding a 'dry_run' parameter or requiring explicit confirmation.
Tool names could better distinguish read-only vs. write operations. All get_* tools are read-only, but add_* and remove_* are write. The naming is clear, but adding an 'idempotentHint' or 'destructiveHint' annotation (MCP 2026-07-28 feature) would make this machine-readable for clients.