An MCP (Message Control Protocol) server for Absolute Security Secure Endpoint Public API. Run it locally and connect it with a wide range of supported MCP Client applications to integrate Absolute to the LLM of your choice and make Absolute work with other systems of your security stack.
{
"mcpServers": {
"absolute-security": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"API_HOST",
"-e",
"API_KEY",
"-e",
"API_SECRET",
"-e",
"TRANSPORT_MODE",
"ghcr.io/absolutesoftware/secure-endpoint-mcp-server:latest"
],
"env": {
"API_HOST": "https://api.absolute.com",
"API_KEY": "<your_symmetric_api_key>",
"API_SECRET": "<your_symmetric_api_secret>",
"TRANSPORT_MODE": "stdio"
}
}
}
}This MCP server interacts with Absolute Secure Endpoint Public API on the user's behalf using symmetric API keys. Please refer to the Authentication section of the Absolute API documentation about how to generate API keys.
The following environment variables are optional. The application uses sensible defaults when these variables are not provided.
API_KEY: (required) API key for authenticationAPI_SECRET: (required) API secret for signing requestsAPI_HOST: The base URL for the Absolute API (default: "https://api.absolute.com"). See Public API Doc for all the available endpoints.ABS_FEATURE_*: Feature flags to enable/disable API groups. For example,ABS_FEATURE_DEVICE_REPORTING=enabledenables the device-reporting API group, andABS_FEATURE_DEVICE_REPORTING=disableddisables it.DISABLE_ADVANCED_API_BLOCKLIST: Set toTrueto disable the blocklist for advanced APIs. When enabled (the default), any API route with "-advanced" in its path is excluded from the MCP server.SERVER_HOST: Host to bind the server to insseorhttptransport mode (default:0.0.0.0)SERVER_PORT: Port to bind the server to insseorhttptransport mode (default:8000)LOG_LEVEL: Logging level (default:info). Valid values aredebug,info,warning,error,critical.TRANSPORT_MODE: Transport mode for the MCP server (default: "http"). Valid values arehttp,sse,stdio. Thehttpmode starts an HTTP server, thessemode starts a Server-Sent Events (SSE) server, and thestdiomode uses standard input/output for communication.HTTP_TIMEOUT_SECONDS: Timeout for HTTP requests in seconds (default: 30)
Feature flags allow you to enable or disable groups of APIs. APIs are grouped by their tags in the OpenAPI spec.
# Enable api_group1 and disable api_group2
export ABS_FEATURE_API_GROUP1=enabled
export ABS_FEATURE_API_GROUP2=disabledBy default, if no feature flags are set, only the "device-reporting" feature is enabled.
- Python 3.13 or higher
uvas project and package manager
secure_endpoint_mcp/: Main package directoryconfig/: Configuration managementclient/: HTTP client with symmetric encryptionfeature_flags/: Feature flag implementationserver/: MCP server implementation
tests/: Unit tests
# Create and activate a virtual environment
uv venv
source .venv/bin/activate
# Install dependencies
uv sync# Install development dependencies
uv pip install -e ".[dev]"
# Run all tests
uv run pytest
# Run tests with coverage report
uv run pytest --cov=secure_endpoint_mcpAll the testings below assume that we have the following env vars
export API_HOST=<api host, for example, https://api.absolute.com>
export API_KEY=<symmetric-api-token-id>
export API_SECRET=<symmetric-api-secret-key>We can run MCP inspector in interactive mode (with browser) to explore the options and its raw outputs.
npx @modelcontextprotocol/inspector \
--transport stdio \
-e "API_KEY=$API_KEY" \
-e "API_SECRET=$API_SECRET" \
-e "API_HOST=$API_HOST" \
-e LOG_LEVEL=debug \
-e TRANSPORT_MODE=stdio \
uv run main.pynpx @modelcontextprotocol/inspector \
--cli \
--method tools/list \
-e "API_KEY=$API_KEY" \
-e "API_SECRET=$API_SECRET" \
-e "API_HOST=$API_HOST" \
-e LOG_LEVEL=debug \
-e TRANSPORT_MODE=stdio \
-- \
uv run main.pynpx @modelcontextprotocol/inspector \
--cli \
--method tools/call \
-e "API_KEY=$API_KEY" \
-e "API_SECRET=$API_SECRET" \
-e "API_HOST=$API_HOST" \
-e LOG_LEVEL=debug \
-e TRANSPORT_MODE=stdio \
uv run main.py \
--tool-name get_devices \
--tool-arg pageSize=\"1\"