An MCP server for the Blindata data governance platform providing access to business glossary, data products, collaboration tools, data catalog, and data quality features
This server exposes 17 read-only tools for a data governance platform. While all tools have descriptions and most parameters are documented, there are systematic gaps in schema formalization, parameter constraint specification, and error handling guidance. All tools are READ_ONLY, which is appropriate, but the schema definitions lack proper JSON Schema type declarations that would be visible to LLMs. The tool naming follows verb-noun convention (get_*, list_*), which is good, but parameter naming has inconsistencies (camelCase vs snake_case). Most critically, output schemas are not documented, making it impossible for LLMs to understand what fields to extract or chain downstream calls. Tools like get_data_categories accept 13 parameters with minimal constraint documentation (no enums for clearance/data_class despite being enumerated lists). Error handling is absent, no recovery guidance, no classification of failure modes. The server implements fastmcp, which is modern, but the tool definitions themselves lack the rigor needed for confident agent deployment.
Retrieves a comment specified by its sequence identifier.
Retrieves the list of existing comments.
Retrieves a DataActor specified by its resource identifier.
Retrieves the list of DataCategories.
Retrieves a Datacategory specified by its resource identifier.
Retrieves a DataProductDomain specified by its resource identifier.
Output schemas are completely undocumented. No tool documents what fields are returned, their types, or how to chain results. LLMs cannot plan multi-tool sequences or extract specific fields without guessing. Every tool returns dict/json without structure description.
Parameter descriptions lack constraint information. Tools accept parameters like 'clearance' with description 'The clearance of the data category to search (CLASSIFIED, SENSITIVE, COMMON)' but these are listed as arrays with no enum declaration. LLMs cannot validate inputs or auto-complete options. Additionally, mixed naming conventions: camelCase (propertiesNames, propertiesValues, teamsCodes, nullPropertiesNames) and snake_case (team_codes, null_team_code, namespace_uuid) appear inconsistently across tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Retrieves the list of DataProducts.
Retrieves the list of existing documents.
Retrieves the logical field.
Retrieves the list of all the defined LogicalFields.
Retrieves a LogicalNamespace specified by its resource identifier.
Retrieves the list of LogicalNamespaces.
Retrieves a LogicalPredicate specified by its resource identifier.
Retrieves the list of LogicalPredicates.
Retrieve the logical relation with the given identifier.
Retrieves the list of LogicalRelations
Retrieves the rating score of a given resource.
No error handling or recovery guidance. All tools catch exceptions and return None or print to stdout without any actionable error message. If an API call fails, the LLM receives no indication of whether to retry, contact the user, or try an alternative. Source: tools/business_glossary/datacategories.py exception handling returns None with print() side-effect.
UUID-by-uuid lookup tools (get_data_category_by_uuid, get_data_actor_by_uuid, etc.) do not accept human-friendly identifiers (names, codes, identifiers). Users typically have names like 'Customer PII' or 'email_domain', not UUIDs. Forcing UUID-only lookups requires an extra search call, increasing latency and complexity.
Inconsistent pagination across tools. Some tools have 'page' + 'size' (get_data_categories: default size=30; get_logical_fields: default size=20; get_data_product_domains: default size=20), others have 'page' + 'size' (get_comments: default size=20; get_documents: default size=20). No tools return 'total_count' or 'next_cursor', making it unclear to LLMs when to stop fetching pages. Tools could return hundreds of results without pagination guidance.
Tool descriptions are generic and do not distinguish similar tools. 'Retrieves the list of...' appears verbatim in get_data_categories, get_logical_fields, get_logical_relations, get_logical_namespaces, get_logical_predicates, get_data_product_domains. LLMs cannot differentiate when to call which tool based on descriptions alone. Descriptions should explain the domain concept: 'Data Categories are business-level groupings of data fields classified by sensitivity and usage.' rather than 'Retrieves the list of DataCategories.'
Parameters like 'sort' are arrays of strings like 'property,(asc|desc)' with no enum or formal constraint. LLMs cannot discover valid properties or sort directions and will guess or hallucinate. Example: get_data_categories has 'sort' described as 'Sorting criteria in the format: property,(asc|desc) (default: ["name,ASC"])', LLMs may pass ['created_at,ASCENDING'] or other invalid formats.