hex-mcp
An MIT-licensed MCP server generated from the official Hex public API specification.
The server loads Hex's current OpenAPI document at startup and exposes its operations as deterministic, snake_case MCP tools through FastMCP.
The PyPI distribution is named hex-openapi-mcp; the installed command and Python import remain hex-mcp and hex_mcp.
Capability modes
read-onlyexposes only operations classified as non-mutating, regardless of the configured Hex token's permissions.fullexposes the complete official API surface.
read-only is the default. It registers GET operations and the non-mutating export_project POST operation. Mutating tools do not exist in the MCP catalog in this mode, even when HEX_API_TOKEN has write permissions.
Install
Requirements: Python 3.12 or newer and uv.
Run the server directly from PyPI:
HEX_API_TOKEN=your_hex_token uvx --from hex-openapi-mcp hex-mcp
Enable the complete API surface explicitly:
HEX_API_TOKEN=your_hex_token HEX_MCP_MODE=full uvx --from hex-openapi-mcp hex-mcp
The default transport is stdio. To run Streamable HTTP:
HEX_API_TOKEN=your_hex_token HEX_TRANSPORT=http uvx --from hex-openapi-mcp hex-mcp
It listens on http://127.0.0.1:8000/mcp by default.
Run from source
Requirements: Python 3.12 or newer and uv.
uv sync --locked --dev
HEX_API_TOKEN=your_hex_token uv run hex-mcp
MCP client configuration
From PyPI:
{
"mcpServers": {
"hex": {
"command": "uvx",
"args": ["--from", "hex-openapi-mcp", "hex-mcp"],
"env": {
"HEX_API_TOKEN": "your_hex_token",
"HEX_MCP_MODE": "read-only"
}
}
}
}
For a local checkout, use "command": "uv" with "args": ["--directory", "/absolute/path/to/hex-mcp", "run", "hex-mcp"].
For stdio, the MCP client passes HEX_API_TOKEN only to the child process. Do not put the token in command-line arguments.
Configuration
| Variable | Default | Purpose |
|---|---|---|
HEX_API_TOKEN |
Required | Hex personal or workspace bearer token |
HEX_MCP_MODE |
read-only |
read-only or full tool catalog |
HEX_API_BASE_URL |
https://app.hex.tech/api |
Hex API base URL |
HEX_OPENAPI_SPEC |
https://static.hex.site/openapi.json |
Official spec URL or a local JSON file |
HEX_TRANSPORT |
stdio |
stdio or http |
HEX_HTTP_HOST |
127.0.0.1 |
Streamable HTTP bind host |
HEX_HTTP_PORT |
8000 |
Streamable HTTP bind port |
HEX_HTTP_PATH |
/mcp |
Streamable HTTP endpoint path |
HEX_REQUEST_TIMEOUT_SECONDS |
30 |
Spec download and Hex API timeout |
Development
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest
The repository does not vendor Hex's specification. Contract behavior can be tested offline by setting HEX_OPENAPI_SPEC to an independently supplied local copy.
Safety and reliability
- Every tool has MCP read-only, destructive, idempotent, and open-world annotations derived from its official operation and HTTP method.
- Tool results and Hex error bodies recursively redact known credential fields and Hex bearer tokens before they reach MCP output or error logging.
- Hex HTTP errors preserve the status, reason, and trace ID in a structured MCP error without exposing internal stack traces.
- GET requests retry transient
429,502,503, and504responses up to twice, respectRetry-After, and use bounded exponential backoff. Write requests are never retried automatically.
Hex's specification currently publishes two semantic paths with backend regex syntax as literal OpenAPI paths. Those literals return 404, while both expanded routes exist. The loader normalizes them to the current /v1/semantic-projects/... naming before generating tools while retaining the original specification digest for observability.
Streamable HTTP currently uses the single server-wide HEX_API_TOKEN and has no inbound client authentication. Keep the default loopback bind unless access is protected by a trusted authentication proxy.
Design documents
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hex_openapi_mcp-0.1.0.tar.gz.
File metadata
- Download URL: hex_openapi_mcp-0.1.0.tar.gz
- Upload date:
- Size: 8.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba6108666160af192759ba19acc8f212bf26cd587944275ea5d890cb44cb4d3b
|
|
| MD5 |
59a5f5f7f1f7727024d558b3f7d5980c
|
|
| BLAKE2b-256 |
adb5e1b6abadc50efbf7838f8470cdf17f391b3a2c3f5f8a3f092cdf621d2ff3
|
File details
Details for the file hex_openapi_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hex_openapi_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9be058023b17158e32eb9dee90f0db7963b42f37bf57d978124883d20d753e8e
|
|
| MD5 |
62e0a0cce1ebbac4f8eb2395d38a2bdf
|
|
| BLAKE2b-256 |
693f1dbc56affa4e507b433b8b095db1f59476aa6ea3e18b654ee260aa5c0e19
|