A Model Context Protocol (MCP) server for interacting with Nautobot APIs using semantic search and dynamic API requests with knowledge base integration
The server presents 20 tools across two implementations (STDIO in server.py and HTTP in server_http.py). Tool definitions are reasonably well-structured with clear names and comprehensive descriptions. However, there are significant gaps: (1) parameter descriptions lack detail in the HTTP variants, tools 11-20 show reduced schema completeness compared to tools 1-10; (2) input schemas exist but many parameters lack explicit type declarations and constraints in the schema definitions (e.g., 'query' is string but no minLength/maxLength; 'n_results' has defaults and min/max but are these enforced?); (3) output schemas are not documented, LLMs cannot infer what fields to extract from responses; (4) error handling guidance is absent, no recovery hints if a tool fails; (5) no tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite obvious semantic differences (read-only search vs. destructive delete). The 10 unique logical tools (API search, API request, refresh index, KB search, KB repo management) are sound, but the HTTP duplication introduces maintenance burden without clear benefit. Parameter naming is verb-noun compliant, and descriptions are in the 150 - 200 char range (good baseline), but descriptions lack actionable guidance (e.g., 'When should I call this instead of the other API search tool?'). Composition is reasonable, tools chain logically (search endpoint → execute request), but the duplicated tool set suggests schema/tool-annotation gaps that would guide the LLM to the right variant.
Execute HTTP requests to Nautobot API for CRUD operations. Use GET to retrieve data, POST to create, PUT/PATCH to update, DELETE to remove. Query the API schema tool first to find correct endpoints and parameters. GET/DELETE use 'params', POST/PUT/PATCH use 'body'.
Add a new GitHub repository to the Nautobot knowledge base for indexing and search.
Initialize all repositories in the knowledge base. Use force=true to reindex all repos.
List all repositories configured in the Nautobot knowledge base with their metadata.
Remove a repository from the Nautobot knowledge base configuration.
Show repository status including document counts, indexing status, and configuration.
HTTP variant tools (tools 11 - 20) have stripped-down parameter descriptions. The server_http.py versions lack the detailed guidance present in server.py (e.g., 'Natural language query describing the API operation...' vs bare 'query'). This degrades LLM understanding in HTTP mode.
No output schemas documented for any tool. Callers cannot infer the response structure, LLMs must guess what fields are returned, risking extraction errors and failed downstream composition. E.g., does nautobot_dynamic_api_request return {status, data, meta}? {result}? Raw JSON?
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 54 | <=2025-11-25 | v2 |
| 2026-03-09 | C | 63 | - | v1 |
Search Nautobot GitHub repositories for code examples, best practices, and documentation. Use for: Jobs/Apps/Plugin examples, implementation patterns, API usage, feature guidance. Returns code snippets and docs with source attribution. Results truncated to 300 chars.
Update repository indexes in the knowledge base. Specify a repo to update one, or omit to update all. Use force=true to reindex even if unchanged.
Search for Nautobot API endpoints using natural language. Returns endpoint paths, methods, parameters, and response formats. Use this before making API requests to find the correct endpoint.
Manually refresh the OpenAPI endpoint index from the latest Nautobot schema.
Search for Nautobot API endpoints using natural language. Returns endpoint paths, methods, parameters, and response formats. Use this before making API requests to find the correct endpoint.
Execute HTTP requests to Nautobot API for CRUD operations. Use GET to retrieve data, POST to create, PUT/PATCH to update, DELETE to remove. Query the API schema tool first to find correct endpoints and parameters. GET/DELETE use 'params', POST/PUT/PATCH use 'body'.
Add a new GitHub repository to the Nautobot knowledge base for indexing and search.
Initialize all repositories in the knowledge base. Use force=true to reindex all repos.
List all repositories configured in the Nautobot knowledge base with their metadata.
Remove a repository from the Nautobot knowledge base configuration.
Show repository status including document counts, indexing status, and configuration.
Search Nautobot GitHub repositories for code examples, best practices, and documentation. Use for: Jobs/Apps/Plugin examples, implementation patterns, API usage, feature guidance. Returns code snippets and docs with source attribution. Results truncated to 300 chars.
Update repository indexes in the knowledge base. Specify a repo to update one, or omit to update all. Use force=true to reindex even if unchanged.
Manually refresh the OpenAPI endpoint index from the latest Nautobot schema.
No error handling guidance. Tools lack recovery hints, if nautobot_dynamic_api_request returns 404 or auth failure, the LLM has no actionable next step. Errors should say 'User not found. Try search_users() first' or 'Auth token expired. Re-authenticate and retry.'
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). The risk field is present in the tool list but not conveyed to the LLM. Tools marked WRITE (e.g., nautobot_dynamic_api_request with DELETE, nautobot_kb_add_repo) should have destructiveHint=true or idempotentHint guidance. This forces LLMs to reason about safety without machine-readable cues.
Parameter constraints are incomplete. 'query' parameters accept strings but lack minLength, maxLength, or pattern hints in the schema. 'n_results' has default=5 and min=1, max=20 in descriptions but unclear if these are enforced in the schema. 'params' and 'body' in nautobot_dynamic_api_request are type:object with no additionalProperties or field requirements, risking invalid requests.
Duplicate tool definitions (10 logical tools registered twice: STDIO versions + HTTP versions with 'mcp_' prefix). This violates the single-responsibility and clarity principles, LLMs must reason about which variant to use. No explanation in descriptions of when to pick the STDIO vs. HTTP version.
Parameter descriptions in HTTP variants are truncated. E.g., mcp_nautobot_dynamic_api_request lists 'method' as type:string enum without the detailed description ('HTTP method: GET (retrieve data), POST (create new)...') present in the STDIO variant. This asymmetry increases confusion.
nautobot_dynamic_api_request and mcp_nautobot_dynamic_api_request accept 'body' and 'params' as bare objects with no field validation or examples. LLMs cannot infer valid field names without error feedback. Include examples in descriptions or return field-level validation errors.
Knowledge base tools (add_repo, remove_repo, update_repos, init_repos) lack guidance on dependencies. E.g., can you add_repo without first calling init_repos? Must repos be in a specific state? These undocumented dependencies force trial-and-error.