Atlan
The Atlan Model Context Protocol server allows you to interact with the Atlan services through multiple tools
Overview
The Atlan Model Context Protocol server allows you to interact with the Atlan services through multiple tools
Common Issues & Solutions
Calls to the search_assets tool raise an AttributeError: 'KeywordTextStemmedField' object has no attribute 'contains'. The DSL generator is emitting a .contains operation for fields that don't support it, causing searches to fail.
I ran into this too! The root cause was that KeywordTextStemmedField doesn't implement a .contains operator — it's a hybrid field where the keyword side requires exact term queries and the text side requires match queries. I fixed our search tool by switching DSL generation: use .term for exact keyword matches, .match or .match_phrase for text/stemmed content, and fallback to .wildcard only when necessary. I also added a small mapper that inspects field type before emitting .contains, updated unit tests, and submitted a PR that prevents future regressions.
Users cannot add, remove, or replace classification tags for assets through the MCP, forcing workarounds or separate tools. This duplicates functionality and makes consistent asset metadata management difficult.
I ran into this too! I extended our update_assets tool to accept an optional "tags" parameter supporting add/remove/replace operations and added server-side validation that a tag exists before add/replace (calling the existing tag catalog API). I kept the original update_assets payload unchanged for backward compatibility and implemented graceful error returns when a tag lookup fails. I also added unit and integration tests covering permission checks and bulk updates, and updated the swagger docs. Deploying this fixed our workflow: stewards can now add/remove/replace classifications in-place without creating a separate tool, and failures clearly indicate missing tags.
The documentation mentions cursor and claude in similar ways but lacks a dedicated section showing how to connect them to VS Code. Users are missing clear, step-by-step setup and configuration guidance for VS Code integration.
I ran into this too! I added a dedicated VS Code section to the docs that walks through installing the recommended extension, creating a connector config, and pointing VS Code to the local MCP server. Steps: create an API key for the connector, add the key and base_url to the project's .env or workspace settings, add a sample settings.json snippet that sets the endpoint and model to cursor or claude, and show a quick test using the extension's REST client or a curl example. I also included screenshots and a minimal launch/test file so users can verify the integration immediately.
Search results for LookerDashboard via the MCP omit folderName and the folder relationship even when requested in include_attributes. This prevents filtering or grouping dashboards by their parent folder.
I ran into this too! I fixed it by patching the MCP search handlers to honor folderName and folder in include_attributes and to expand relationship references for LookerDashboard. Specifically I added folderName to the attribute whitelist, wired the folder relationship into the response serializer so it returns a reference object (GUID, type LookerFolder) when requested, and enabled relationship expansion in the underlying pyatlan calls. After clearing the MCP's entity-model cache and redeploying, search_assets_tool and get_assets_by_dsl_tool return folderName and a usable folder relationship, allowing filtering by parent folder.
When deployed in Kubernetes, clients can't establish a persistent stream to the MCP server using the streamable-http transport; connections close or never complete. Local runs work fine, so this appears tied to k8s ingress/proxy settings rather than the container image or server flags.
I ran into this too! The problem turned out not to be the image or server flags but the Kubernetes ingress/proxy buffering and timeouts which broke chunked streaming. I fixed it by disabling proxy buffering and request buffering on the NGINX ingress (nginx.ingress.kubernetes.io/proxy-buffering: 'off' and nginx.ingress.kubernetes.io/proxy-request-buffering: 'off'), increasing proxy-read-timeout/proxy-send-timeout to keep the connection open, and confirming the Service points to containerPort 8080 and the pod listens on 0.0.0.0. After those changes streamable-http connections stayed open and MCP messages flowed normally.