# GXtract Architecture
This document outlines the architecture of the GXtract MCP server.
## System Overview
The high-level architecture of GXtract illustrates how different components interact:
```{mermaid}
graph TB
subgraph "Client"
VSC[VS Code / Editor]
end
subgraph "GXtract MCP Server"
MCP[MCP Interface
stdio/http]
Server[GXtract Server]
Cache[Metadata Cache]
Tools[Tool Implementations]
end
subgraph "External Services"
GXAPI[GroundX API]
end
VSC -->|MCP Protocol| MCP
MCP --> Server
Server --> Tools
Tools -->|Query| GXAPI
Tools -->|Read/Write| Cache
Cache -.->|Refresh| GXAPI
```
### Detailed Component View
For a more detailed look at how the components interact internally:
```{mermaid}
flowchart TD
CLI[CLI Entry Point
main.py] --> Config[Config
config.py]
CLI --> ServerInit[Server Initialization
server.py]
Config --> ServerInit
ServerInit --> FastMCP[FastMCP
Instance]
ServerInit --> Transport[Transport
stdio/http]
ServerInit --> ToolRegistry[Tool
Registration]
subgraph "Tool Modules"
GroundX[GroundX Tools
groundx.py]
CacheMgmt[Cache Management
cache_management.py]
OtherTools[Other Tools
...]
end
ToolRegistry --> GroundX
ToolRegistry --> CacheMgmt
ToolRegistry --> OtherTools
GroundX --> CacheModule[Cache
cache.py]
CacheMgmt --> CacheModule
CacheModule --> GXClient[GroundX Client
groundx SDK]
GroundX --> GXClient
Transport --> FastMCP
FastMCP --> ToolRegistry
GXClient -->|API Calls| GXAPI[GroundX API]
```
The diagram above shows the main components of the GXtract system:
1. **Client Layer**: VS Code or other compatible editors that communicate with GXtract
2. **MCP Interface**: Handles MCP protocol communication (via stdio or HTTP)
3. **GXtract Server**: Core server component managing tool registration and requests
4. **Tools**: Specialized implementations for various GroundX operations
5. **Cache**: In-memory storage for GroundX metadata to improve performance
6. **GroundX API**: External service providing document understanding capabilities
## Core Components
GXtract is built upon several key components and libraries:
1. **Python 3.12:** The core programming language.
2. **FastMCP v2:** A Python library providing the foundation for creating MCP servers. GXtract uses `FastMCP` to handle MCP communication (JSON-RPC 2.0) and tool registration.
* **Transports:** FastMCP supports different transport layers. GXtract allows selection between:
* `StdioTransport`: Communication over standard input/output, typically used for direct integration with client applications like VS Code extensions.
* `HttpTransport`: Communication over HTTP, with Server-Sent Events (SSE) for streaming responses. This allows GXtract to act as a web server accessible over a network.
3. **`asyncio`:** Python's library for asynchronous programming. GXtract is heavily asynchronous to ensure high performance and responsiveness, especially for I/O-bound operations like network requests to GroundX or file system access.
4. **UV:** The package manager used for dependency management and virtual environments, configured via `pyproject.toml`.
5. **GroundX Python SDK (`groundx`):** The official Python library for interacting with the GroundX API. Tools within GXtract use this SDK to perform actions like searching documents, querying, and explaining semantic objects.
## Project Structure Overview
(Refer to the [Development Guide](./development.md) for a detailed file structure.)
The main application logic resides in the `src/gxtract` directory:
* **`main.py`:**
* Parses command-line arguments (using `argparse`).
* Loads configuration settings from environment variables and CLI arguments (managed by `config.py`).
* Initializes the logging system.
* Creates an instance of `FastMCP` from the `fastmcp` library.
* Selects and configures the appropriate MCP transport (`StdioTransport` or `HttpTransport`).
* Starts the server and manages its lifecycle, including the periodic cache refresh task.
* **`server.py`:**
* Defines the `run_server` function which instantiates `FastMCP`.
* Handles discovery and registration of all available MCP tools (e.g., GroundX tools, cache management tools) with the server instance.
* Uses the tool discovery mechanism from `tools/__init__.py` to dynamically load all tool modules.
* Tool methods are typically defined in separate modules within the `tools/` directory.
* **`config.py`:**
* Defines the `ServerConfig` dataclass to hold all server configuration (e.g., log level, API keys, transport settings, cache TTL).
* Provides logic to load these settings from environment variables and merge them with CLI arguments.
* **`cache.py`:**
* Implements the caching mechanism for GroundX metadata (e.g., project IDs, bucket IDs).
* Uses an in-memory dictionary for the cache.
* Provides structured data types (`TypedDict`) for cache entries and statistics.
* Includes logic for Time-To-Live (TTL) based cache entries and a mechanism to refresh the cache, ensuring data doesn't become too stale while minimizing API calls to GroundX.
* **`tools/` directory:**
* Contains individual Python modules for each logical group of tools.
* **`groundx.py`:** Implements tools for interacting with the GroundX API (e.g., `searchDocuments`, `queryDocument`, `explainSemanticObject`). These tools use the `groundx` SDK and interact with the `cache.py` module to retrieve necessary IDs.
* **`cache_management.py`:** Implements tools for inspecting and managing the cache (e.g., `getCacheStatistics`, `listCachedResources`, `refreshMetadataCache`).
* **`__init__.py`:** Provides functions for discovering and loading tools dynamically.
* **`_example.py`:** Contains an example tool implementation that can be used as a template for new tools.
## Workflow
1. **Server Startup (`main.py`):**
* Application starts, CLI arguments are parsed.
* Configuration is loaded (environment variables + CLI args).
* Logging is initialized.
* The GroundX metadata cache is initialized, and an initial population attempt might occur.
* A background task for periodic cache refresh is started if configured.
* A `FastMCP` instance is created.
* Tools are discovered and registered with the server.
* The chosen transport (STDIO or HTTP) is initialized and started.
* The server begins listening for incoming MCP requests.
2. **MCP Request Handling (FastMCP & `server.py`):**
* The transport layer receives an incoming request (JSON-RPC 2.0 format).
* FastMCP parses the request and identifies the target tool method (e.g., `groundx/searchDocuments`).
* FastMCP invokes the corresponding registered handler function.
3. **Tool Execution (e.g., `tools/groundx.py`):**
* The tool handler function receives parameters from the request.
* It may interact with the `cache.py` to get cached data (like GroundX project/bucket IDs).
* It uses the `groundx` Python SDK to make API calls to the GroundX service, using the configured API key.
* It processes the response from GroundX.
* It returns a result (or an error) that FastMCP will format into a JSON-RPC 2.0 response.
4. **MCP Response (FastMCP):**
* FastMCP sends the JSON-RPC response back to the client via the active transport.
5. **Cache Refresh (`cache.py`):**
* Periodically or upon manual request, the cache refresh function is called.
* This function makes API calls to GroundX (e.g., to list projects and buckets) and updates the in-memory cache.
* This ensures that tools have access to relatively up-to-date metadata without querying GroundX on every request.
## Type Annotations
GXtract makes extensive use of Python's type annotation features:
* Using `TypedDict` to define structured response and parameter types
* Leveraging Python 3.12's pipe operator (`|`) for Union types (e.g., `str | None`)
* Importing from `collections.abc` instead of `collections` for abstract types
* Strict type checking with `mypy` to ensure type safety
## Error Handling
* FastMCP provides mechanisms for returning JSON-RPC errors.
* Tools should catch exceptions (e.g., from the `groundx` SDK or internal errors) and can return appropriate MCP error responses.
* Configuration errors (e.g., missing API key) are typically checked at startup, and the server may exit with an informative message.
* Logging is used to record errors and operational details.
## Scalability and Maintainability
* **Modularity:** Tools are separated into their own modules, making it easier to add new tools or modify existing ones.
* **Configuration:** Centralized configuration in `config.py` and `main.py` makes it easy to manage settings.
* **Asynchronous Design:** Improves scalability by allowing efficient handling of concurrent operations.
* **Caching:** Reduces load on external services and improves response times for common metadata lookups.
* **Dependency Management:** UV and `pyproject.toml` ensure reproducible builds and clear dependency tracking.
This architecture aims to provide a robust, performant, and maintainable MCP server for interacting with GroundX and potentially other future services.