{
  "markdown": "# ALTR MCP Server\n\n<!-- mcp-name: io.github.altrsoftware/altr-mcp-server -->\n\n[![PyPI](https://img.shields.io/pypi/v/altr-mcp.svg)](https://pypi.org/project/altr-mcp/)\n[![Python](https://img.shields.io/pypi/pyversions/altr-mcp)](https://pypi.org/project/altr-mcp/)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE.md)\n[![CI](https://github.com/altrsoftware/altr-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/altrsoftware/altr-mcp-server/actions/workflows/ci.yml)\n[![Security](https://github.com/altrsoftware/altr-mcp-server/actions/workflows/security.yml/badge.svg)](https://github.com/altrsoftware/altr-mcp-server/actions/workflows/security.yml)\n\n[ALTR](https://www.altr.com) provides tag-based data masking, access governance, and classification for Snowflake, Databricks, and OLTP databases. This MCP server enables AI assistants (Claude, Cursor, and other MCP clients) to manage data security on the ALTR platform, covering database connections, tag masking, policies, classification, access management, audits, telemetry, and sidecar configuration.\n\n> **New to ALTR?** See the [ALTR documentation](https://docs.altr.com) for an overview of the platform, concepts, and supported data sources.\n\nAll tools return structured `{success, data, error}` responses and can run over stdio, SSE, or streamable-http transports.\n\n## Table of Contents\n\n- [Quick Start](#quick-start)\n- [Getting Credentials](#getting-credentials)\n- [Configuration](#configuration)\n  - [Restricting Tools](#restricting-tools)\n- [Setup](#setup)\n  - [Claude Desktop](#claude-desktop)\n  - [Claude Code (CLI)](#claude-code-cli)\n  - [Cursor](#cursor)\n  - [VS Code (GitHub Copilot)](#vs-code-github-copilot)\n  - [Windsurf](#windsurf)\n  - [Running from Local Source](#running-from-local-source)\n- [CLI](#cli-optional)\n- [Tools](#tools)\n- [Data Source Support](#data-source-support)\n- [Troubleshooting](#troubleshooting)\n- [Development](#development)\n- [License](#license)\n\n## Quick Start\n\n1. **Install from PyPI:**\n\n   ```bash\n   pip install altr-mcp\n   ```\n\n   Or run directly with [uvx](https://docs.astral.sh/uv/guides/tools/) (no install required):\n\n   ```bash\n   uvx altr-mcp\n   ```\n\n   > `uvx` is part of the [uv](https://docs.astral.sh/uv/) Python package manager. Install it with `pip install uv` or see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/).\n\n2. **Set the three required environment variables** (see [Getting Credentials](#getting-credentials) for where to find each in the ALTR console):\n\n   ```bash\n   export ORG_ID=your-org-id\n   export MAPI_KEY=your-api-key\n   export MAPI_SECRET=your-api-secret\n   ```\n\n3. **Wire it into your AI client** — see [Setup](#setup) for Claude Desktop, Claude Code, Cursor, VS Code, and Windsurf. The same three env vars go into the client's `env` block.\n\n4. **Verify** by asking your AI assistant to run a read-only tool:\n\n   - \"List my ALTR databases\" → calls `get_databases`\n   - \"Show me the tags connected to ALTR\" → calls `get_tags`\n   - \"List the ALTR roles in my org\" → calls `get_roles`\n\n   If these return data, your setup is working.\n\n## Getting Credentials\n\nYou need three values from the ALTR platform to configure this server. See [Manage API keys](https://docs.altr.com/account-and-api/api/api-keys/) for the full reference.\n\n| Credential | Where to find it |\n|---|---|\n| `ORG_ID` | In the ALTR console: **Settings > Preferences > Organization** — copy the value from \"ALTR Organization ID\" |\n| `MAPI_KEY` | In the ALTR console: **Settings > Preferences > API > Add New** — give it a description, then copy the key |\n| `MAPI_SECRET` | Shown once when you create the API key above — copy and store it securely |\n\n## Configuration\n\nSet the following environment variables before starting the server:\n\n| Variable | Required | Description |\n|---|---|---|\n| `ORG_ID` | Yes | ALTR organization ID |\n| `MAPI_KEY` | Yes | ALTR management API key |\n| `MAPI_SECRET` | Yes | ALTR management API secret |\n| `MCP_TRANSPORT` | No | Transport protocol: `stdio` (default), `sse`, or `streamable-http` |\n| `MCP_HOST` | No | Bind address for HTTP transports (default: `0.0.0.0`) |\n| `MCP_PORT` | No | Port for HTTP transports (default: `8000`) |\n| `RESTRICTED_TOOLS` | No | Comma-separated tool names to hide from clients |\n| `LOG_FORMAT` | No | Log output format: `console` (default) or `json` |\n| `LOG_LEVEL` | No | Log level (default: `INFO`) |\n| `MAX_RETRIES` | No | Attempts per API call before giving up (default: `3`, minimum `1`) |\n| `DISABLE_RETRY` | No | Set `true` to disable retries entirely (default: `false`) |\n| `REQUEST_TIMEOUT` | No | Per-request timeout in seconds (default: `30`) |\n| `MAX_RETRY_AFTER` | No | Ceiling in seconds on a server-sent `Retry-After` (default: `60`) |\n\n`MAX_RETRIES` counts total attempts, not retries on top of the first, so `1`\ndisables retrying without disabling the retry path. Backoff is exponential with\njitter; a `Retry-After` response header overrides it, clamped to\n`MAX_RETRY_AFTER` so a server cannot park a call indefinitely.\n\n#### Endpoint overrides\n\nEvery ALTR service endpoint can be pointed elsewhere, which is useful against\na non-production ALTR environment. All are optional — leave them unset in\nnormal use.\n\nThe seven per-service endpoints are derived from your `ORG_ID` as\n`https://<ORG_ID>.<service>.live.altr.com`, four of them with a version path\nsegment appended. An override replaces the whole value, so it must include that\npath segment where the default has one — see the table.\n\n| Variable | Default |\n|---|---|\n| `ALTR_API_BASE_URL` | `https://api.live.altr.com` |\n| `ALTR_ALTRNET_BASE_URL` | `https://altrnet.live.altr.com` |\n| `ALTR_CLASSIFICATION_BASE_URL` | `https://<ORG_ID>.classification.live.altr.com` |\n| `ALTR_SC_CONTROL_BASE_URL` | `https://<ORG_ID>.sc-control.live.altr.com` |\n| `ALTR_SERVICE_USER_BASE_URL` | `https://<ORG_ID>.service-user.live.altr.com` |\n| `ALTR_AUDIT_REPORT_BASE_URL` | `https://<ORG_ID>.audit-report.live.altr.com/v1` |\n| `ALTR_VAULT_BASE_URL` | `https://<ORG_ID>.vault.live.altr.com/api/v2` |\n| `ALTR_CRITICAL_BASE_URL` | `https://<ORG_ID>.critical.live.altr.com/v2` |\n| `ALTR_KMA_BASE_URL` | `https://<ORG_ID>.kma.live.altr.com/v1` |\n\n### Restricting Tools\n\nUse `RESTRICTED_TOOLS` to hide specific tools from MCP clients. Restricted tools are removed from the tool list and blocked if called directly.\n\nNames must match the registered tool name exactly. An entry that matches nothing restricts nothing, and is logged as a warning the first time a client lists tools. Note that 11 tools were renamed from `delete_*` to `disconnect_*` in 0.4.0.\n\nFor example, to give a team read-only access without any destructive operations:\n\n```bash\nRESTRICTED_TOOLS=disconnect_database,delete_policy,delete_rule,disconnect_tag,disconnect_tag_by_details,delete_classifier,delete_collection,disconnect_sc_repo,disconnect_sc_sidecar\n```\n\nOr in the Claude Desktop config:\n\n```json\n{\n  \"mcpServers\": {\n    \"altr\": {\n      \"command\": \"uvx\",\n      \"args\": [\"altr-mcp\"],\n      \"env\": {\n        \"ORG_ID\": \"your-org-id\",\n        \"MAPI_KEY\": \"your-api-key\",\n        \"MAPI_SECRET\": \"your-api-secret\",\n        \"RESTRICTED_TOOLS\": \"disconnect_database,delete_policy,delete_rule,disconnect_tag\"\n      }\n    }\n  }\n}\n```\n\nThis is an operator-level safety net — it prevents accidental or unwanted tool usage but is not a substitute for proper API key permissions.\n\n## Setup\n\n### Claude Desktop\n\nAdd the following to your `claude_desktop_config.json` (Settings > Developer > Edit Config):\n\n```json\n{\n  \"mcpServers\": {\n    \"altr\": {\n      \"command\": \"uvx\",\n      \"args\": [\"altr-mcp\"],\n      \"env\": {\n        \"ORG_ID\": \"your-org-id\",\n        \"MAPI_KEY\": \"your-api-key\",\n        \"MAPI_SECRET\": \"your-api-secret\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code (CLI)\n\n```bash\nclaude mcp add altr -e ORG_ID=your-org-id -e MAPI_KEY=your-api-key -e MAPI_SECRET=your-api-secret -- uvx altr-mcp\n```\n\nThis writes the config to `.mcp.json` which can be committed to share with your team.\n\n### Cursor\n\nAdd to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project-scoped):\n\n```json\n{\n  \"mcpServers\": {\n    \"altr\": {\n      \"command\": \"uvx\",\n      \"args\": [\"altr-mcp\"],\n      \"env\": {\n        \"ORG_ID\": \"your-org-id\",\n        \"MAPI_KEY\": \"your-api-key\",\n        \"MAPI_SECRET\": \"your-api-secret\"\n      }\n    }\n  }\n}\n```\n\n### VS Code (GitHub Copilot)\n\nOpen User Settings JSON (Ctrl+Shift+P → \"Preferences: Open User Settings (JSON)\") and add:\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"altr\": {\n        \"command\": \"uvx\",\n        \"args\": [\"altr-mcp\"],\n        \"env\": {\n          \"ORG_ID\": \"your-org-id\",\n          \"MAPI_KEY\": \"your-api-key\",\n          \"MAPI_SECRET\": \"your-api-secret\"\n        }\n      }\n    }\n  }\n}\n```\n\n### Windsurf\n\nAdd to `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"altr\": {\n      \"command\": \"uvx\",\n      \"args\": [\"altr-mcp\"],\n      \"env\": {\n        \"ORG_ID\": \"your-org-id\",\n        \"MAPI_KEY\": \"your-api-key\",\n        \"MAPI_SECRET\": \"your-api-secret\"\n      }\n    }\n  }\n}\n```\n\n### Running from Local Source\n\nTo run from a local clone instead of the published PyPI package:\n\n**Claude Code:**\n\n```bash\nclaude mcp add altr \\\n  -e ORG_ID=your-org-id \\\n  -e MAPI_KEY=your-api-key \\\n  -e MAPI_SECRET=your-api-secret \\\n  -- uv run --directory /path/to/altr-mcp altr-mcp\n```\n\n**Claude Desktop:**\n\n```json\n{\n  \"mcpServers\": {\n    \"altr\": {\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--directory\", \"/path/to/altr-mcp\", \"altr-mcp\"],\n      \"env\": {\n        \"ORG_ID\": \"your-org-id\",\n        \"MAPI_KEY\": \"your-api-key\",\n        \"MAPI_SECRET\": \"your-api-secret\"\n      }\n    }\n  }\n}\n```\n\n## CLI (Optional)\n\n> This section is for building a standalone CLI binary from the MCP server. If you just want to use the server with Claude Desktop or Claude Code, skip to [Tools](#tools).\n\nA standalone CLI lets you call ALTR tools directly from the terminal without an MCP client. It's built with [mcporter](https://github.com/openclaw/mcporter), an open-source tool that compiles MCP servers into native CLI binaries. See the [mcporter docs](https://github.com/openclaw/mcporter) for the full set of options.\n\n### Prerequisites\n\n- [uv](https://docs.astral.sh/uv/) (Python package manager)\n- [Node.js](https://nodejs.org/) (for `npx` to fetch and run `mcporter`)\n\n`mcporter` itself does not need to be installed separately — `npx` downloads and runs it on demand.\n\n### Building\n\nFrom the repo root:\n\n```bash\nnpx mcporter generate-cli --command \"uv run --directory . altr-mcp\" --name altr-cli --compile ./altr-cli\n```\n\nThis generates a compiled binary at `./altr-cli`.\n\n### Usage\n\nSet your credentials as environment variables, then run any tool:\n\n```bash\nexport ORG_ID=your-org-id\nexport MAPI_KEY=your-api-key\nexport MAPI_SECRET=your-api-secret\n\n# List databases\n./altr-cli get-databases\n\n# Get a specific database ID\n./altr-cli get-database-id --database-name \"my_database\"\n\n# Create a masking policy\n./altr-cli create-policy --tag \"STOPLIGHT\"\n\n# Add rules (pass JSON string for complex params)\n./altr-cli add-rules --policy-id \"TAG#abc123\" --rules '[{\"masking_policy\": 10001, \"role\": \"PUBLIC\", \"tag_value\": \"red\"}]'\n\n# Search query audits\n./altr-cli search-query-audits --limit 10\n\n# JSON output\n./altr-cli get-databases --output json\n\n# See all available commands\n./altr-cli --help\n```\n\nThe CLI runs the MCP server locally via `uv run` and requires the repo to be present at the working directory. All environment variables from the [Configuration](#configuration) section apply.\n\n## Tools\n\nFor a full breakdown of every tool with parameters, behavior, and examples, see [docs/index.md](./docs/index.md).\n\n| Domain | Tools | What it does |\n|---|---|---|\n| [Databases](./docs/databases.md) | 8 | Connect Snowflake, OLTP, and Databricks data sources. Setup per platform: [Snowflake](https://docs.altr.com/data-sources/snowflake/), [OLTP](https://docs.altr.com/data-sources/oltp/), [Databricks](https://docs.altr.com/data-sources/databricks/). |\n| [Tags](./docs/tags.md) | 8 | Manage Snowflake tag connections to ALTR. See [Connecting Snowflake Tags to ALTR](https://docs.altr.com/data-sources/snowflake/policy-on-snowflake/manage-tags/). |\n| [Policies & Rules](./docs/policies.md) | 8 | Create masking policies and per-role rules. Tag-based ([Snowflake](https://docs.altr.com/data-sources/snowflake/policy-on-snowflake/), [Databricks](https://docs.altr.com/data-sources/databricks/policy-on-databricks/)) and [column-based](https://docs.altr.com/features/data-access-controls/data-masking/column-based-masking/) (Snowflake only). [Masking levels 10000–10009](https://docs.altr.com/features/data-access-controls/data-masking/masking-types/). Includes `get_roles` — list all ALTR roles (called [user groups](https://docs.altr.com/page-descriptions/user-groups/) in the ALTR console). |\n| [Classification](./docs/classification.md) | 36 | Run automated [data classification scans](https://docs.altr.com/features/data-classification/). Snowflake (in-house + ALTR Native + GDLP), OLTP (ALTR Native + GDLP), Databricks (GDLP only). Includes findings-tree navigation and human review decisions. |\n| [Access Management](./docs/access-management.md) | 4 | Access management policies for [Snowflake and OLTP](https://docs.altr.com/features/data-access-controls/access-management-policy/). |\n| [Access Requests](./docs/access-requests.md) | 6 | Submit, approve, deny, and cancel data access approval requests. |\n| [Audits](./docs/audits.md) | 6 | Search sidecar, Snowflake query, and platform [system audits](https://docs.altr.com/features/database-activity-monitoring/). |\n| [Audit Reports](./docs/audit-report.md) | 17 | Create, schedule, and review structured audit report definitions and instances, including comments and sign-offs. |\n| [Telemetry](./docs/telemetry.md) | 9 | Monitor [ALTR sidecar proxy](https://docs.altr.com/data-sources/oltp/) agent and sidecar instance health. |\n| [Sidecar Configuration](./docs/sidecar-config.md) | 37 | Configure the [ALTR sidecar proxy](https://docs.altr.com/data-sources/oltp/sidecar-integration/) — agents, repos, repo users, service users, sidecars, listeners, and bindings. |\n| [Vault Tokenization](./docs/vault-tokenization.md) | 4 | Tokenize and detokenize values using ALTR vaulted tokenization. |\n| [Critical Tokenization](./docs/critical-tokenization.md) | 4 | Tokenize and detokenize values using ALTR critical tokenization. |\n| [Key Management](./docs/key-management.md) | 9 | Manage FPE encryption keys and tweaks. |\n\n### Critical callouts\n\nA few things are easy to miss and worth surfacing here:\n\n**Snowflake tags vs Databricks tags.** A **Snowflake tag** is a first-class ALTR object — you register it with `connect_tag`, it gets a `tag_group_id`, and shows up in `get_tags`, `get_tag_details*`, `update_tag`, and `disconnect_tag*`. A **Databricks tag** is the opposite: not an ALTR object at all, just a raw string you pass into `create_policy` (with `policy_type=\"PUSHDOWN\"` and `database_ids=[…]`). Databricks tags never appear in `get_tags` and do not have a `tag_group_id`. None of the Tags tools apply to Databricks.\n\n**Databricks `create_policy` requirements.** When creating a masking policy for a Databricks metastore, you **must** pass `database_ids` as a list — even for a single database (e.g. `database_ids=[2167]`) — and set `policy_type=\"PUSHDOWN\"`. Omitting `database_ids` or using `policy_type=\"TAG\"` will be rejected by the API. Snowflake policies do the opposite: omit `database_ids` and let `policy_type` default to `TAG`.\n\n## Data Source Support\n\nPlatform setup guides on the ALTR docs site:\n- [Snowflake](https://docs.altr.com/data-sources/snowflake/)\n- [OLTP databases](https://docs.altr.com/data-sources/oltp/) (PostgreSQL, MySQL, Oracle, SQL Server)\n- [Databricks](https://docs.altr.com/data-sources/databricks/)\n\n| Feature | Snowflake | OLTP (via sidecar) | Databricks |\n|---|---|---|---|\n| Database connections | ✅ | — | ✅ |\n| Masking policies | ✅ | ❌ | ✅ |\n| Classification | ✅ | ✅ | ⚠️ Partial |\n| Access management policies | ✅ | ✅ | ❌ |\n| Access requests | ✅ | ❌ | ❌ |\n| Query audit logging | ✅ | ✅ | ❌ |\n| System audit logging | ✅ | ✅ | ❌ |\n| Sidecar configuration | — | ✅ | — |\n| Telemetry & monitoring | — | ✅ | — |\n\n**Legend:** ✅ Supported &nbsp; ⚠️ Partial &nbsp; ❌ Not supported &nbsp; — Not applicable\n\n**Classification mode coverage:**\n\n| Mode | Snowflake | OLTP | Databricks |\n|---|---|---|---|\n| In-house (ALTR pattern matching) | ✅ | ❌ | ❌ |\n| ALTR Native classifiers | ✅ | ✅ | ❌ |\n| GDLP (Google Cloud DLP) | ✅ | ✅ | ✅ |\n\n**Databricks classification — Partial:** GDLP only via `create_databricks_job`; no in-house or ALTR Native classifiers. A `collection_name` may optionally be passed to scope the scan to a specific ALTR collection's classifiers (subject to `condition_types`); when omitted, all default Google DLP infoTypes are used.\n\n**Access management policies (Databricks):** This MCP server does not currently expose Databricks grant or access management APIs. For Databricks access control, use the Databricks UI or REST API directly.\n\n**OLTP** refers to relational databases (PostgreSQL, MySQL, Oracle, SQL Server) accessed through a customer-managed [ALTR sidecar proxy](https://docs.altr.com/data-sources/oltp/).\n\n## Troubleshooting\n\n### Checking which version you are running\n\n```bash\nuvx altr-mcp --version\n```\n\nThis works without credentials. Your AI client also reports the same version as the server version when it connects, which is the quickest way to confirm the client actually picked up an upgrade.\n\n### `uvx: command not found`\n\nInstall [uv](https://docs.astral.sh/uv/getting-started/installation/): `pip install uv` or via the [official installer](https://docs.astral.sh/uv/getting-started/installation/).\n\n### Server not appearing in your AI client\n\nRestart your AI client after editing the config file — changes are not picked up automatically.\n\n### `ERROR: Missing required environment variables`\n\nVerify `ORG_ID`, `MAPI_KEY`, and `MAPI_SECRET` are set in the `env` block of your client config. Variable names are case-sensitive.\n\n### Tools returning `{\"success\": false, ...}`\n\n| HTTP status | Likely cause | Fix |\n|---|---|---|\n| `401` | Invalid credentials | Verify `MAPI_KEY` / `MAPI_SECRET` in the ALTR console under **Settings > Preferences > API** |\n| `403` | Feature not enabled for this organization | The endpoint exists but is gated by an ALTR feature flag your org doesn't have turned on. Contact ALTR support to confirm the feature is enabled for your account. |\n| `404` | Resource not found | Confirm the ID exists in your organization |\n| `429` | Rate limited | The server retries automatically up to 3× with backoff; if persistent, reduce request frequency |\n\n### A tool is missing from the tool list\n\nCheck whether the tool name appears in the `RESTRICTED_TOOLS` env var in your client config. Restricted tools are hidden from the tool list entirely.\n\n### A restricted tool is still exposed\n\n`RESTRICTED_TOOLS` matches names exactly, so a misspelled or renamed entry restricts nothing. Check the server log for `tool_restriction_middleware.unknown_tools`, which names any entry that matched no registered tool.\n\n### Timeouts on large result sets\n\nUse pagination parameters (`limit`, `offset`, or `cursor`) available on audit, telemetry, and classification tools to reduce response size.\n\n## Development\n\n### Running Tests\n\n```bash\n# Install dependencies\nuv sync --extra dev\n\n# Run all tests\nuv run pytest\n\n# Run with verbose output\nuv run pytest -v\n\n# Run a specific test file\nuv run pytest tests/integration/test_database.py\n\n# Run a specific test\nuv run pytest tests/integration/test_database.py::test_create_database_with_service_user\n\n# Run with coverage report (terminal)\nuv run pytest --cov=altr_mcp --cov-report=term-missing\n\n# Run with coverage and generate an HTML report at htmlcov/index.html\nuv run pytest --cov=altr_mcp --cov-report=html\n```\n\n### Project Structure\n\n```\naltr_mcp/\n  server.py          # MCP server entrypoint and tool registration\n  settings.py        # Pydantic settings (env vars)\n  instructions.md    # System prompt for LLM tool guidance\n  tools/             # Tool definitions (one file per domain)\n  utils/             # API client functions (one file per API)\ntests/\n  unit/              # Unit tests (settings, models, annotations)\n  integration/       # Integration tests (httpx mocks per domain)\n```\n\n## Learn More\n\n**Platform setup**\n- [ALTR documentation home](https://docs.altr.com)\n- [Snowflake data source](https://docs.altr.com/data-sources/snowflake/)\n- [OLTP data source](https://docs.altr.com/data-sources/oltp/)\n- [Databricks data source](https://docs.altr.com/data-sources/databricks/)\n- [Manage API keys](https://docs.altr.com/account-and-api/api/api-keys/)\n\n**Data access controls**\n- [Tag-based access policy — Snowflake and Databricks](https://docs.altr.com/features/data-access-controls/data-masking/tag-based-masking/)\n- [Column-based access policy — Snowflake](https://docs.altr.com/features/data-access-controls/data-masking/column-based-masking/)\n- [Masking policies (10000–10009 types)](https://docs.altr.com/features/data-access-controls/data-masking/masking-types/)\n- [Access management policy & Managing Access Requests](https://docs.altr.com/features/data-access-controls/access-management-policy/)\n\n**Discovery and observability**\n- [Data Classification](https://docs.altr.com/features/data-classification/)\n- [Database Activity Monitoring](https://docs.altr.com/features/database-activity-monitoring/)\n\n**Protocol**\n- [Model Context Protocol specification](https://modelcontextprotocol.io)\n\n## License\n\nCopyright (C) 2026 ALTR Solutions, Inc.\n\nGNU General Public License v3.0 or later (`GPL-3.0-or-later`). See\n[LICENSE.md](LICENSE.md) for the copyright notice and the full license text.\n",
  "bytes": 21882,
  "sha": "102c8fb73aa0503fbcc8ffec887798bc0e337a0e04211914b6dba2e85cbe4902",
  "repo_slug": "altrsoftware/altr-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_altrsoftware_altr_mcp_server_163112ad/readme"
}