Catalog PyPI
PACKAGE EXPLORERView in registry

action1-mcp-server

PyPI

MCP server somente leitura para a API do Action1 (patches, vulnerabilidades e inventário)

action1claudemcppatch-managementrmmvulnerability
Versions collected1
Direct dependencies2From release 1.0.0
Last observed20 Oct, 18:31 UTC

README

Version 1.0.0 documentation

Action1 MCP Server

Give Claude, ChatGPT or Codex read-only access to everything in your Action1 console.

Managed endpoints, missing patches, vulnerabilities, software inventory, automations, reports and audit trail, through the Model Context Protocol.

PyPI Python License: MIT Read-only MCP

Quick start · What you can ask · Available data · Tools · Development


🚀 Quick start

1. Install

pip install action1-mcp-server

2. Get your API credentials

In Action1, go to Settings → API Credentials → Add API Credentials, assign the Viewer role, and copy the Client ID (an api-key-...@action1.com address) and the Client Secret. The secret is shown only once.

3. Connect your AI client

Claude Desktop

Edit claude_desktop_config.json. On Windows it is in %APPDATA%\Claude\; on macOS, in ~/Library/Application Support/Claude/.

{
  "mcpServers": {
    "action1": {
      "command": "action1-mcp-server",
      "env": {
        "ACTION1_CLIENT_ID": "api-key-...@action1.com",
        "ACTION1_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Then quit Claude Desktop completely (on Windows: tray icon → Quit) and open it again.

Claude Code
claude mcp add action1 -e ACTION1_CLIENT_ID=api-key-...@action1.com -e ACTION1_CLIENT_SECRET=your-client-secret -- action1-mcp-server
Codex CLI, Codex IDE extension and ChatGPT desktop app

All three share the same configuration file, so you only need to set it up once.

Using the Codex CLI:

codex mcp add action1 --env ACTION1_CLIENT_ID=api-key-...@action1.com --env ACTION1_CLIENT_SECRET=your-client-secret -- action1-mcp-server

Or edit ~/.codex/config.toml (on Windows: %USERPROFILE%\.codex\config.toml):

[mcp_servers.action1]
command = "action1-mcp-server"

[mcp_servers.action1.env]
ACTION1_CLIENT_ID = "api-key-...@action1.com"
ACTION1_CLIENT_SECRET = "your-client-secret"

In the ChatGPT desktop app you can also add it from Settings → MCP servers → Add server → STDIO, then select Restart.

[!NOTE] ChatGPT on the web can't use this server: it doesn't read local configuration and only connects to remote MCP servers. Use the ChatGPT desktop app or Codex instead.

The data center region (North America, Europe, UK, Australia) is detected automatically on the first login. To pin it, set ACTION1_REGION.

Updating

pip install --upgrade action1-mcp-server

Restart your AI client afterwards. Your configuration stays the same.

💬 What you can ask

Ask in plain language, in any language:

  • "List the Action1 routes and what each one returns"
  • "Give me an overview of the environment: endpoints, missing patches and vulnerabilities"
  • "Which endpoints need a reboot or haven't checked in for more than 30 days?"
  • "Show endpoint FINANCE-LAPTOP01 with its missing updates and CVEs"
  • "List the critical CVEs in the CISA KEV catalog and which endpoints have them"
  • "Which critical updates are past their SLA?"
  • "How did last Friday's patch automation go on each endpoint?"
  • "Who logged in to the console this week?"

📦 Available data

All routes below were tested against a live Action1 account with a Viewer credential.

RouteWhat it returns
organizations, enterpriseOrganizations and enterprise details
me, usersThe credential's user and the console users
endpoints/managed/{orgId}Endpoints: status, last seen, IP, MAC, OS, hardware, logged-on user, agent version, groups, pending reboot, missing patch and CVE counts
endpoints/managed/{orgId}/{id}/missing-updatesUpdates missing on one endpoint
endpoints/groups/{orgId}Endpoint groups and their members
vulnerabilities/{orgId}CVEs found on endpoints: CVSS, CISA KEV, affected software and versions, fixing update, remediation deadline and status
vulnerabilities/{orgId}/{cveId}, CVE-descriptions/{cveId}CVE details, affected endpoints and documented compensating controls
updates/{orgId}Missing OS and third-party patches: severity, approval, SLA, KB
installed-software/{orgId}/dataSoftware inventory, per organization or per endpoint
software-repository/{orgId}Software repository packages and versions
automations/schedules/{orgId}, automations/instances/{orgId}Scheduled automations, runs and per-endpoint results
reports/all, reportdata/{orgId}/{reportId}/dataReport catalog (~76 built-in reports) and report rows (CSV/HTML export)
scripts/all, settings/all, setting-templates/allScript library and advanced settings
audit/eventsAudit trail: logins, remote sessions, configuration changes, API calls
subscription/*, roles, logs/{orgId}, endpoints/deployers/{orgId}, data-sources/allLicense, roles, diagnostic logs, Deployers and data sources (need a role above Viewer)

Parameters, fields, required permissions and quirks for each route are documented in ENDPOINTS.md (in Portuguese). The map was built from Action1's official OpenAPI 3.1 specification, published at app.action1.com/apidocs.

🧰 Tools

Tool names are in Portuguese; your AI assistant picks the right one from your request. In Action1, an endpoint is a managed computer, so the tools call computers máquinas and API paths rotas.

ToolDescription
action1_getCalls any GET route and passes every parameter through unchanged. {orgId} in the path is replaced with the default organization. With paginar=True it paginates automatically up to max_registros. arquivo_saida saves the full result to disk.
listar_rotasReturns the API map (routes, parameters, fields, permissions, limits), so the assistant knows what it can request
listar_organizacoesLists the account's organizations (their IDs are the orgId used by the routes)
listar_maquinasLists endpoints with search and filters for status, pending reboot, patch and vulnerability status, OS and group
buscar_maquinaFetches one endpoint by ID or name, with its missing updates, CVEs and, optionally, installed software
listar_vulnerabilidadesLists CVEs by severity, remediation status, endpoint, publication date, CVE list or CISA KEV
buscar_cveCVE details, affected endpoints, documented controls, and whether the CVE is present in the organization
listar_atualizacoesLists missing patches by severity, approval status and text
listar_softwaresSoftware inventory for the organization or for one endpoint
listar_automacoesScheduled automations, automation runs, or the per-endpoint result of one run
consultar_relatorioReads a report by name or ID; without a name, lists the report catalog
listar_auditoriaAudit trail for a date range, by event type or text
resumo_ambienteEnvironment overview: endpoints by status, connection, OS, agent version and group; stale and pending-reboot endpoints; endpoints with the most missing patches and CVEs; patches by severity, approval and SLA; CVEs by severity, remediation status, KEV and product

The resource action1://rotas exposes the full API map as Markdown.

Example of a generic call
{
  "endpoint": "vulnerabilities/{orgId}",
  "params": {
    "score": "Critical",
    "remediation_status": "Overdue",
    "filter": "Chrome",
    "sortby": "-cvss_score"
  },
  "paginar": true,
  "max_registros": 500
}

🚦 Limits and behavior

TopicBehavior
AuthenticationOAuth2 with Client ID and Client Secret. The access token lasts 1 hour and is renewed automatically; if the API rejects it, the server logs in again once.
Rate limitAction1 doesn't publish a number. On 429 the server waits for the Retry-After delay and retries. Local throttling can be turned on with ACTION1_RATE_LIMIT.
PermissionsEach route needs a permission from the credential's role. Without it, the response is {"erro": "sem_permissao", ...} with the name of the missing permission.
OrganizationsA single-organization account is used automatically. With several, endpoints, CVEs, patches and software queries cover all of them (orgId=all); the other tools ask for org_id (or ACTION1_ORG_ID).
Paginationfrom + limit, with next_page or total_items (sometimes an estimate such as "10+"). The server never requests 1-item pages, because limit=1 misbehaves in the API.
DatesThe API answers in UTC, formatted YYYY-MM-DD_HH-mm-ss. In the tools, YYYY-MM-DD dates are read as days in Brasília time.
Errors401, 403, 404, 400 (with the API's message) and timeouts come back as JSON: {"erro": ..., "mensagem": ...}. Timeouts and 5xx errors are retried with backoff.
Large responsesResponses longer than ACTION1_MAX_CHARS are truncated (long strings such as base64 images and scripts first, then lists), with a hint to narrow the query. Use arquivo_saida to save the complete result.
Optional environment variables
VariableDefaultPurpose
ACTION1_REGIONauto-detectedna, na-2, eu, uk or au
ACTION1_BASE_URLExplicit base URL (overrides the region)
ACTION1_ORG_IDthe only organizationOrganization used in place of {orgId}
ACTION1_RATE_LIMIT0Requests per minute (0 disables local throttling)
ACTION1_PAGE_SIZE100Page size for automatic pagination
ACTION1_MAX_RETRIES3Retries on 429, 5xx and timeouts
ACTION1_MAX_ESPERA120Longest wait (seconds) accepted for a 429 retry
ACTION1_TIMEOUT60Per-request timeout (seconds)
ACTION1_MAX_CHARS60000Maximum response size before truncation
ACTION1_LOG_LEVELWARNINGLog level (always written to stderr)

🔒 Security

  • Read-only. The server only sends GET requests; the one exception is the internal POST /oauth2/token login. Three GET routes are also blocked, even with permitir_nao_listados=True: the agent installer link, the Deployer installer link and remote sessions.
  • Use a Viewer credential. The server's blocklist is a second layer; the role on the credential is the first. A Viewer key can't change anything even if a request gets through.
  • Secret handling. The Client ID and Secret are read only from the environment, never written to logs, and the secret and tokens are removed from every response and error message.
  • Audited. Every API call, including GETs, shows up in Action1's Audit Trail under the credential's user.
  • Real company data. The credential sees your whole fleet, so conversations may contain hostnames, IP and MAC addresses, logged-on user names and vulnerability details. Request only what you need and follow your company's data protection policy.
  • One credential per person. Never share the secret in chat, e-mail or GitHub issues. If it leaks, revoke it in Settings → API Credentials right away.

📥 Other installation methods

Requires Python 3.10 or newer.

MethodCommand
PyPIpip install action1-mcp-server
uv, without installinguvx action1-mcp-server (in claude_desktop_config.json: "command": "uvx", "args": ["action1-mcp-server"])
GitHubpip install git+https://github.com/jpedrocrc/Action1-MCP-Server
Windows: "command not found"

pip installs the executable in ...\Python3xx\Scripts. If that folder is not on your PATH, your AI client cannot find action1-mcp-server. Use the full path to the .exe in "command", or set "command": "python" and "args": ["-m", "action1_mcp"].

🛠 Development

Project structure
FileContents
pyproject.tomlPackage metadata, dependencies and the action1-mcp-server command
src/action1_mcp/server.pyMCP server and tools
src/action1_mcp/ENDPOINTS.mdAPI map. The server reads the JSON block at the end of this file, so supporting a new route only takes adding it there.
test_server.pyOffline tests and coverage tests against the real API

Local setup

git clone https://github.com/jpedrocrc/Action1-MCP-Server
cd Action1-MCP-Server
pip install -e .

With -e, code changes take effect without reinstalling; just restart your AI client. To switch back to the published version, run pip uninstall -y action1-mcp-server, then pip install action1-mcp-server.

[!NOTE] The package requires mcp<2. Version 2.x of the mcp SDK renamed FastMCP, and the server has not been migrated yet.

Tests

python test_server.py --offline

Runs without network access. It checks the API map, tool registration, pagination (against simulated responses) and the safeguards (blocked routes, GET-only code, secret and token masking).

python test_server.py

Needs ACTION1_CLIENT_ID and ACTION1_CLIENT_SECRET. It calls every mapped route with limit=2, reuses the IDs it finds to test routes that need one, then calls every tool. Routes the credential's role can't reach are reported as SEM PERMISSÃO, not as failures. It takes about 1 minute.

To try the server in the MCP Inspector (requires uv and npx), run the command below and set ACTION1_CLIENT_ID and ACTION1_CLIENT_SECRET under Environment Variables before connecting:

mcp dev src/action1_mcp/server.py
Releasing a new version
  1. Bump the version in pyproject.toml (version) and src/action1_mcp/__init__.py (__version__). PyPI never accepts the same version number twice.
  2. Run both test modes.
  3. Build:
    Remove-Item -Recurse -Force dist -ErrorAction SilentlyContinue; uv build
    
  4. Publish with a PyPI token scoped to the action1-mcp-server project:
    $env:UV_PUBLISH_TOKEN = "pypi-..."; uv publish
    
  5. Check in a clean environment: pip install --upgrade action1-mcp-server, then pip show action1-mcp-server.
  6. Commit and push to GitHub.

If a published version is broken, yank it on PyPI (project → Releases → version → Yank) and publish the fix as a new version. Don't delete files: deletion is permanent and the file name can never be reused.

📋 Changelog

VersionChanges
1.0.0First release.

📄 License

MIT © João Pedro Rodrigues

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
1.0.010 Oct 20262

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:31 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:14be0f0bcb16203852451cf951efef67e2ec89a0377e4e55f50a831d917b36dc