MCP server for Bio/Bioinformatics APIs with Code Mode execution, GraphQL, SPARQL, and REST API support
Server defines 5 tools with reasonable descriptions and schemas. All tools have descriptions (50-300 chars, within baseline 34-392 range). Input schemas use Zod with type definitions and descriptions. However, output schemas are not documented, LLMs cannot predict return structure. Tool names are action-oriented (search, execute, graphql_execute, sparql_execute) but lack verb_noun clarity for execute variants. Parameters are well-described but lack enums for constrained values (e.g., no enum for workspace parameter). Error handling is minimal, no recovery guidance or categorization. Security: tools accept 'code' parameters that run in sandboxed V8, but no explicit mention of input sanitization or injection prevention in visible code.
Search the API catalog (legacy mode). Returns matching endpoints with full parameter docs. Use this to discover API capabilities before calling execute. Categories are listed. USAGE IN execute: api.get(path, params) for GET, api.post(path, body, params) for POST. Path params like /lookup/{id} are auto-interpolated from params. Remaining params become query string. Large responses (>100KB) are auto-staged: check result.__staged, return the staging info, use query_data to explore. Use limit/pagination params to control response size.
Execute JavaScript code against the API. Code runs in a sandboxed V8 isolate with: searchSpec(query) / searchPaths(query) — search the API spec; listCategories() / listTags() — inspect tags/categories; getEndpoint(path) / getOperation(idOrPath) — get endpoint docs; describeEndpoint(path, method?) / describeOperation(idOrPath) — format endpoint docs; spec — full frozen OpenAPI spec object; api.get(path, params) for GET, api.post(path, body, params) for POST; Path params like /lookup/{id} are auto-interpolated from params; Remaining params become query string; Large responses (>100KB) are auto-staged: check result.__staged, return the staging info, use query_data to explore; Use limit/pagination params to control response size. Large datasets auto-stage for SQL queries.
Execute JavaScript code against a GraphQL API. Code runs in a sandboxed V8 isolate with: gql.query(queryString, variables?) — GraphQL execution through host; schema.types(), schema.type(), schema.search() etc. — introspection helpers; db.stage(), db.queryStaged(), api.query() — staging helpers; console.log() capture. Optionally also a SECOND, REST upstream (api.get/api.post) routed through the same host proxy + DO-SQLite staging (hybrid GraphQL+REST).
Search the API spec. Write JavaScript code to search the OpenAPI spec, or use legacy query/category arguments for keyword search. Available functions: searchPaths(query, maxResults=10) — keyword search across paths, summaries, tags, parameters; listTags() — list all tags with operation counts; getOperation(idOrPath) — get full operation by operationId or path; describeOperation(idOrPath) — formatted documentation for an operation; searchSpec/query helpers are also available for backward compatibility inside execute(); spec — the full frozen OpenAPI spec object (spec.paths, spec.info, etc.). Use search to discover endpoints, then write code in execute to call them.
Output schemas not documented. LLMs cannot predict return structure (fields, types, pagination). Violates pattern:tool and pattern:response-shaper.
Tool names 'execute', 'graphql_execute', 'sparql_execute' lack clear verb_noun structure. 'execute' is generic and ambiguous, does not convey what code runs against. Should be 'execute_rest_api', 'execute_graphql_query', 'execute_sparql_query'.
No error handling guidance. Tools accept arbitrary JavaScript code, if execution fails, no recovery hints provided. Violates pattern:recovery-guide and pattern:error-classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Execute JavaScript code against a SPARQL endpoint. Code runs in a sandboxed V8 isolate with: sparql.query(queryString, opts?) — run SELECT/CONSTRUCT/DESCRIBE; returns array of plain { variable: value } rows; sparql.ask(queryString) — run ASK; returns boolean; sparql.raw(queryString, opts?) — return unparsed JSON envelope; prefixes — object of common ontology prefixes (rdfs, owl, xsd, skos, dcterms, void, obo, uberon, go, ncbigene, efo, obi, sio, up, ensembl, bgee); prefixHeader — pre-built PREFIX block to prepend to queries; console logging (log, warn, error, info) — captured output; fs.readFile / fs.writeFile / fs.glob — persistent virtual filesystem (when enabled); Large SPARQL responses (>30KB) are auto-staged into SQLite.
Parameters lack enums for constrained values. 'workspace' parameter is optional string with no enum or validation. 'query' in search tool accepts free-form strings, no guidance on valid keywords or format.
No pagination or result-limiting guidance in output. Tools return large responses (>100KB auto-staged) but no documented limit or next_cursor pattern. Violates pattern:paginated-result.