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
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
- The client registers itself on the server (
https://mcp.ardumaker.com, dynamic registration). Registering grants no access. - 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.
- The person approves or rejects and picks the scope: all projects or some, all VPS or some (separately), and whether it is read-only.
- The client gets an
access_token(8 hours) and arefresh_token(30 days, single-use) and calls tools with OAuth 2.1 + PKCE. - 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-serverand/.well-known/oauth-protected-resource. /tools.json: the public tool reference, with no authentication. The readable version is at /mcp/docs.pinganswers without a token; everything else requires one.tools/listcomes 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,confirmacionwith 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 markedidempotente: 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_operacionalways answers the same way:estadoen_curso,okorerror, andreintentar_en_segundoswhile it runs. - A finished operation's result stays available for a few days, so after a disconnect it can be recovered with
ver_operacioninstead 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
| Path | What it serves |
|---|---|
/mcp | Everything; it never changes |
/mcp/vps | VPS, domains and nginx, Linux users, systemd, tasks, databases, deploys, tunnels, logs and Apps |
/mcp/proyectos | Projects, stages, tasks, checklists, comments, attachments, calendar, meetings and trash |
/mcp/infra | Email, domains and DNS, blogs, billing status, RouterIA and Search API keys, WhatsApp sandbox and webhooks |
/mcp/wordpress | WordPress 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
| Limit | Value | What happens past it |
|---|---|---|
| Calls per connection | 10 per second | limite_excedido with reintentar_en_segundos; the rejection does not use quota |
| Lists in an answer | 200 items | It is cut and <key>_recortado with the real total is added |
limit out of range | Each tool's maximum | It is clamped and reported in limit_ajustado |
| Commands on a VPS | 10 per second per VPS; 20000-character output; 10 to 300 s wait | Rejection or truncated output (truncated: true) |
| DNS changes | 10 per minute per company | 429 |
| Manual VPS backups | 1 per hour per VPS | 429 |
Some tools have their own, lower limits, stated in their description.
Diagram
- MCP client: session Bearer token
- Audit: wraps everything: rejections are recorded too
- Per-connection limit: 10 calls per second
- Guards: read-only, system admin, idempotency
- Tool: same service as the panel, with the live scope
- Answer: data, or a structured error
Expected result
- The client shows the tools of the chosen profile, already filtered by scope.
ver_contexto_inicialconfirms on whose behalf the agent acts and what it can do./meshows 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` | Means | Retryable? |
|---|---|---|
no_encontrado | The id does not exist; it may include valid candidatos | No |
sin_permiso | The person, the scope or the MCP rule do not allow it | No |
parametro_invalido | An argument is wrong; detalle says which | No |
conflicto | An argument must change (for example, confirming) | No |
estado_invalido | The world is not ready: VPS stopped, external service down | Yes |
limite_excedido | A limit was exceeded; wait reintentar_en_segundos | Yes |
interno | Unexpected error; carries a correlacion_id to report it | Yes, once |
reintentable: truemeans repeating the SAME call, unchanged, may work.- In OAuth,
invalid_grantwithRefresh token already used; the session was revokedmeans 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_appfor what the catalog offers; the deploy configuration (guardar_config_deploy_app) for the processes of a Git app;crear_servicio_vpsandcrear_tarea_vpsfor the rest;ejecutar_comando_vpsonly if none of the above fits.