Generate AI images, video and audio with 55 models, priced in credits before you generate.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer followed by your Arumi API key, from https://arumi.ai/api-keys
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Finish an upload after the PUT; returns the asset_id to pass in a generation's references.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http arumi https://api.arumi.ai/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer followed by your Arumi API key, from https://arumi.ai/api-keysFinish an upload after the PUT; returns the asset_id to pass in a generation's references.
| Argument | Type | Description |
|---|---|---|
| upload_id* | string |
{
"type": "object",
"required": [
"upload_id"
],
"properties": {
"upload_id": {
"type": "string"
}
},
"additionalProperties": false
}Start uploading one of the user's files to use as a reference. PUT the file's bytes to upload_url with exactly the returned headers, then call complete_upload.
| Argument | Type | Description |
|---|---|---|
| width | integer | required for images: width in pixels |
| height | integer | required for images: height in pixels |
| sha256* | string | the file's SHA-256 as 64 lower-case hex characters (shasum -a 256) |
| file_name* | string | the file's name, with its extension |
| size_bytes* | integer | |
| content_type* | string | for example image/png, image/jpeg, video/mp4, audio/mpeg |
{
"type": "object",
"required": [
"file_name",
"content_type",
"size_bytes",
"sha256"
],
"properties": {
"width": {
"type": "integer",
"description": "required for images: width in pixels"
},
"height": {
"type": "integer",
"description": "required for images: height in pixels"
},
"sha256": {
"type": "string",
"description": "the file's SHA-256 as 64 lower-case hex characters (shasum -a 256)"
},
"file_name": {
"type": "string",
"description": "the file's name, with its extension"
},
"size_bytes": {
"type": "integer"
},
"content_type": {
"type": "string",
"description": "for example image/png, image/jpeg, video/mp4, audio/mpeg"
}
},
"additionalProperties": false
}Start a generation with the user's credits. It is refused, with nothing charged, when it would cost more than max_credits. Returns at once with a generation_id: call get_generation until it has succeeded or failed.
| Argument | Type | Description |
|---|---|---|
| model* | string | the model id from list_models |
| prompt | string | what to make; for speech models the text to read |
| parameters | object | the model's settings by key (get_model); any left out take the model's default |
| references | null | object | uploaded files the model works from |
| max_credits* | integer | the most credits the user agreed to spend on this generation; it is refused when the quote is higher |
| idempotency_key | string | optional, 16-128 characters [A-Za-z0-9._:-]: repeating a call with the same key returns the same generation instead of making another |
{
"type": "object",
"required": [
"model",
"max_credits"
],
"properties": {
"model": {
"type": "string",
"description": "the model id from list_models"
},
"prompt": {
"type": "string",
"description": "what to make; for speech models the text to read"
},
"parameters": {
"type": "object",
"description": "the model's settings by key (get_model); any left out take the model's default",
"additionalProperties": true
},
"references": {
"type": [
"null",
"object"
],
"properties": {
"audio": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded audio files, in the order of the model's audio slots"
},
"images": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded images (complete_upload), in the order of the model's image slots"
},
"videos": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded videos, in the order of the model's video slots"
}
},
"description": "uploaded files the model works from",
"additionalProperties": false
},
"max_credits": {
"type": "integer",
"description": "the most credits the user agreed to spend on this generation; it is refused when the quote is higher"
},
"idempotency_key": {
"type": "string",
"description": "optional, 16-128 characters [A-Za-z0-9._:-]: repeating a call with the same key returns the same generation instead of making another"
}
},
"additionalProperties": false
}The user's Arumi credits: available, held by running generations, and owed. 1 credit = 0.01 USD.
No arguments.
{
"type": "object",
"additionalProperties": false
}A generation's status; once it has succeeded, links to its results, and what it charged.
| Argument | Type | Description |
|---|---|---|
| generation_id* | string |
{
"type": "object",
"required": [
"generation_id"
],
"properties": {
"generation_id": {
"type": "string"
}
},
"additionalProperties": false
}One model's prompt limit, the reference files it takes, and its settings with their allowed values and defaults.
| Argument | Type | Description |
|---|---|---|
| model* | string | the model id from list_models |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"description": "the model id from list_models"
}
},
"additionalProperties": false
}The user's latest generations, newest first, made on the site or through any of their keys.
| Argument | Type | Description |
|---|---|---|
| limit | integer | how many, newest first (1โ20, default 10) |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "how many, newest first (1โ20, default 10)"
}
},
"additionalProperties": false
}The models the user can generate with, by kind (image, video, audio, text). get_model gives one model's inputs and settings.
| Argument | Type | Description |
|---|---|---|
| modality | string | only this kind: image, video, audio or text |
{
"type": "object",
"properties": {
"modality": {
"type": "string",
"description": "only this kind: image, video, audio or text"
}
},
"additionalProperties": false
}What a generation would cost, in credits, without making it. Tell the user before generating.
| Argument | Type | Description |
|---|---|---|
| model* | string | the model id from list_models |
| prompt | string | what to make; for speech models the text to read |
| parameters | object | the model's settings by key (get_model); any left out take the model's default |
| references | null | object | uploaded files the model works from |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"description": "the model id from list_models"
},
"prompt": {
"type": "string",
"description": "what to make; for speech models the text to read"
},
"parameters": {
"type": "object",
"description": "the model's settings by key (get_model); any left out take the model's default",
"additionalProperties": true
},
"references": {
"type": [
"null",
"object"
],
"properties": {
"audio": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded audio files, in the order of the model's audio slots"
},
"images": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded images (complete_upload), in the order of the model's image slots"
},
"videos": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "asset ids of uploaded videos, in the order of the model's video slots"
}
},
"description": "uploaded files the model works from",
"additionalProperties": false
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.