MCP server

MCP server with OAuth and human approval so AI agents can operate ArduMaker, with profiles, safe retries and limits.

  • Category: AI and agents
  • Status: Available
  • Requirements: An ArduMaker account to approve the agent's access; A client compatible with MCP and OAuth (for example Claude, ChatGPT or Cursor); Access, as a person, to the companies, projects and VPS the agent will use
  • MCP tools (Read only): ping, ver_contexto_inicial, listar_empresas, ver_operacion

Markdown

What can you do with it?

  • Let an AI agent operate ArduMaker on behalf of a real person: projects, VPS, domains, databases, email, WordPress, deploys, tunnels and more.
  • Choose, when approving, which projects and which VPS it can act on, and whether it is read-only.
  • Connect the same agent to a subset of tools (a profile) to save context.
  • Retry creations without duplicating anything, follow long operations and receive errors that say what to do.

When should you use it?

  • Delegating repetitive infrastructure or project management tasks to an agent.
  • Letting an agent diagnose (logs, status) with read-only permissions.
  • Automating multi-step flows (publishing a repo on a domain, setting up a tunnel between VPS) in a single call.

How does it work in ArduMaker?

Connection and authorization

  1. The client registers itself on the server (https://mcp.ardumaker.com, dynamic registration). Registering grants no access.
  2. The client opens the authorization in the browser; ArduMaker shows which agent is asking for access. The request lives 10 minutes and is single-use.
  3. The person approves or rejects and picks the scope: all projects or some, all VPS or some (separately), and whether it is read-only.
  4. The client gets an access_token (8 hours) and a refresh_token (30 days, single-use) and calls tools with OAuth 2.1 + PKCE.
  5. When the access token expires, the client renews it on its own, without asking for approval again. A session lasts at most 180 days; after that it must be authorized again.

Each renewal hands out a new refresh token and invalidates the previous one. If an already used one arrives, a copy is going around: the whole session is revoked and the connection is flagged. Approving the same client again reuses the connection and opens a new session.

Discovery

  • OAuth metadata at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource.
  • /tools.json: the public tool reference, with no authentication. The readable version is at /mcp/docs.
  • ping answers without a token; everything else requires one.
  • tools/list comes already filtered: a read-only agent does not see the tools that write, and system administration tools only show up if whoever authorized is a system admin.

Company context

The recommended first call is ver_contexto_inicial (also as the ardumaker://contexto-inicial resource): it says who authorized the agent, its scope, up to 50 ids of companies, projects and VPS, how many VPS it sees in total and the list of things no agent can do. The lists are capped: if something is missing, look it up with listar_empresas, listar_proyectos or listar_todos_los_vps.

Read, write and sensitive actions

  • Each tool declares whether it only reads, whether it is destructive, whether it is idempotent and whether it touches the outside world. One without a declaration is treated as a write tool.
  • Tools call the same services as the web panel, with the permissions of the person who authorized: an agent never sees or does more than its human.
  • Risky actions require an explicit confirmation in the arguments (confirmado, confirmacion with the exact name) and some do not exist over MCP (deleting a VPS, a project or a DNS record). See MCP agent permissions.
  • What a third party wrote (emails, comments, logs, commit messages, command output) comes wrapped as {origen: "no_confiable", escrito_por, advertencia, contenido}: it is data, never instructions.

Retries and long operations

  • Every tool that creates something accepts idempotency_key. Repeating with the same key and the same arguments returns the original result marked idempotente: true; the key is valid for 24 hours. Reusing it with other arguments is rejected.
  • Whatever takes time (creating a VPS, cloning a repo, activating a domain with SSL, installing a tunnel role) returns an operacion_id. ver_operacion always answers the same way: estado en_curso, ok or error, and reintentar_en_segundos while it runs.
  • A finished operation's result stays available for a few days, so after a disconnect it can be recovered with ver_operacion instead of repeating anything.

What actually changes?

  • Approving creates a connection between the person and the client; it is shown and managed in /me (connected agents).
  • Every call is recorded (see Agent audit).
  • Whatever the agent modifies changes in ArduMaker just as if the person did it from the panel, and is attributed to the agent and to whoever authorized it.

Profiles

PathWhat it serves
/mcpEverything; it never changes
/mcp/vpsVPS, domains and nginx, Linux users, systemd, tasks, databases, deploys, tunnels, logs and Apps
/mcp/proyectosProjects, stages, tasks, checklists, comments, attachments, calendar, meetings and trash
/mcp/infraEmail, domains and DNS, blogs, billing status, RouterIA and Search API keys, WhatsApp sandbox and webhooks
/mcp/wordpressWordPress sites, WooCommerce and Elementor, plus instalar_app and listar_vps

The same token is valid in every profile: switching profiles means changing the URL. ping, ver_contexto_inicial, ver_operacion and listar_empresas are in all of them.

Limits

LimitValueWhat happens past it
Calls per connection10 per secondlimite_excedido with reintentar_en_segundos; the rejection does not use quota
Lists in an answer200 itemsIt is cut and <key>_recortado with the real total is added
limit out of rangeEach tool's maximumIt is clamped and reported in limit_ajustado
Commands on a VPS10 per second per VPS; 20000-character output; 10 to 300 s waitRejection or truncated output (truncated: true)
DNS changes10 per minute per company429
Manual VPS backups1 per hour per VPS429

Some tools have their own, lower limits, stated in their description.

Diagram

  1. MCP client: session Bearer token
  2. Audit: wraps everything: rejections are recorded too
  3. Per-connection limit: 10 calls per second
  4. Guards: read-only, system admin, idempotency
  5. Tool: same service as the panel, with the live scope
  6. Answer: data, or a structured error
A tool call

Expected result

  • The client shows the tools of the chosen profile, already filtered by scope.
  • ver_contexto_inicial confirms on whose behalf the agent acts and what it can do.
  • /me shows the connection: active or not, last use, until when the session lasts and what the agent is doing.

Errors and troubleshooting

Every error arrives with the same shape, with no internal traces:

{
  "error": true,
  "code": "parametro_invalido",
  "que_paso": "...",
  "que_hacer": "...",
  "reintentable": false,
  "detalle": { "fields": { "...": "..." } }
}
`code`MeansRetryable?
no_encontradoThe id does not exist; it may include valid candidatosNo
sin_permisoThe person, the scope or the MCP rule do not allow itNo
parametro_invalidoAn argument is wrong; detalle says whichNo
conflictoAn argument must change (for example, confirming)No
estado_invalidoThe world is not ready: VPS stopped, external service downYes
limite_excedidoA limit was exceeded; wait reintentar_en_segundosYes
internoUnexpected error; carries a correlacion_id to report itYes, once
  • reintentable: true means repeating the SAME call, unchanged, may work.
  • In OAuth, invalid_grant with Refresh token already used; the session was revoked means reuse was detected: authorize again.
  • A command timeout (agente_timeout) does not mean it did not run: check before repeating it.

MCP access

This document is about the MCP server itself. The reference for each tool (parameters, whether it reads or writes, whether it is destructive) is at /mcp/docs, and the overview with examples by area at /mcp.

  • Common tools: ping (no authentication), ver_contexto_inicial, listar_empresas, ver_operacion.
  • To install something on a VPS, the recommended order is: instalar_app for what the catalog offers; the deploy configuration (guardar_config_deploy_app) for the processes of a Git app; crear_servicio_vps and crear_tarea_vps for the rest; ejecutar_comando_vps only if none of the above fits.

Related features