Skip to main content
Glama
aimedialab

Risha.ai MCP Server

Official
by aimedialab
README.md
# Risha.ai MCP Server

A Model Context Protocol (MCP) server for the Risha.ai API.

This server lets MCP clients such as **Codex**, **Claude Code**, and Claude Desktop discover Risha API operations, authenticate with email/password, inspect capabilities, check credit balance and create generation requests.

## Features

- Email/password authentication using Risha `/auth/login/`
- Automatic login at MCP startup
- Automatic startup context loading:
  - current user
  - active capabilities
  - credit wallet / balance
- Generic Swagger-backed API caller for all Risha operations
- Convenience generation helpers:
  - `risha_generate_image`
  - `risha_create_generation`
- Automatic polling for generation completion

## Requirements

- Node.js 18+
- A valid Risha.ai account (www.risha.ai)
- An MCP-capable client, for example:
  - Codex
  - Claude Code
  - Claude Desktop

## Install

```bash
git clone https://github.com/aimedialab/risha-mcp-server.git
cd risha-mcp-server
npm install
```

## Environment variables

Required for email/password login:

```bash
RISHA_EMAIL="you@example.com"
RISHA_PASSWORD="your-password"
```

Optional:

```bash
RISHA_API_BASE_URL="https://adminxcore-api.risha.ai/api"
```

Token-based auth is also supported, but email/password is the recommended flow:

```bash
RISHA_API_TOKEN="your-access-token"
RISHA_REFRESH_TOKEN="your-refresh-token"
```

> Never commit real credentials. Put them in your MCP client config or a local `.env` file. `.env` is ignored by git.

## Run manually

```bash
RISHA_EMAIL="you@example.com" RISHA_PASSWORD="your-password" npm start
```

Expected startup log:

```text
[risha-mcp] logged in, loaded 32 capabilities, credit balance: 72621
```

An MCP stdio server normally waits silently after startup. That is expected.

## Available MCP tools

### `risha_api_info`

Shows API metadata, authentication mode, startup status, capabilities count, credit balance, and Swagger tag list.

### `risha_startup_state`

Shows the context loaded at startup:

- login state
- current user
- capabilities count
- credit balance
- startup errors, if any

### `risha_capabilities`

Returns the active capabilities retrieved at startup.

Input example:

```json
{
  "filter": "image",
  "limit": 20
}
```

### `risha_credit_balance`

Returns credit balance, wallet, summary, and user wallet data.

### `risha_refresh_context`

Logs in again and refreshes current user, capabilities, and credit data.

### `risha_login`

Manually logs in with `RISHA_EMAIL` and `RISHA_PASSWORD` and caches the JWT for the current MCP session.

### `risha_list_operations`

Searches all Swagger operations.

Input example:

```json
{
  "filter": "generation",
  "limit": 20
}
```

### `risha_get_operation`

Returns schema details for one operation.

Input example:

```json
{
  "operationId": "generation-requests_create"
}
```

### `risha_call`

Generic caller for any Swagger operation.

Input example:

```json
{
  "operationId": "auth_me"
}
```

Generation request example:

```json
{
  "operationId": "generation-requests_create",
  "body": {
    "capability": 21,
    "title": "MCP smoke test",
    "prompt_data": {
      "prompt": "a red apple on a white table",
      "resolution": "0.5k",
      "aspect_ratio": "1:1"
    }
  }
}
```

### `risha_create_generation`

Creates any generation request and optionally polls until it reaches a terminal state.

Input example:

```json
{
  "capability": 21,
  "title": "MCP image test",
  "prompt_data": {
    "prompt": "a red apple on a white table",
    "resolution": "0.5k",
    "aspect_ratio": "1:1"
  },
  "wait": true,
  "timeoutSeconds": 300,
  "pollSeconds": 5
}
```

### `risha_generate_image`

Convenience text-to-image tool. Defaults to capability `21`, `0.5k`, `1:1`.

Input example:

```json
{
  "prompt": "a cinematic photo of a red apple on a white table",
  "resolution": "0.5k",
  "aspect_ratio": "1:1",
  "timeoutSeconds": 300,
  "pollSeconds": 5
}
```

### `risha_resolve_media_url`

Converts a private authenticated Risha media URL into a signed public CDN URL.

Input example:

```json
{
  "url": "https://adminxcore-api.risha.ai/api/media/asset/4c6cbe1c-7696-4c13-8790-6456e5d64698/?f=webp&h=600&q=85&w=600"
}
```

## Use with Codex

Codex reads MCP servers from `~/.codex/config.toml`.

Add this block:

```toml
[mcp_servers.risha]
command = "node"
args = ["/absolute/path/to/risha-mcp-server/src/index.js"]
startup_timeout_sec = 60

[mcp_servers.risha.env]
RISHA_EMAIL = "you@example.com"
RISHA_PASSWORD = "your-password"
```

For the local project path created by this agent:

```toml
[mcp_servers.risha]
command = "node"
args = ["/Users/amirhamdani/Documents/risha-mcp-server/src/index.js"]
startup_timeout_sec = 60

[mcp_servers.risha.env]
RISHA_EMAIL = "you@example.com"
RISHA_PASSWORD = "your-password"
```

Restart Codex after editing the config.

### Codex test prompts

```text
Use the Risha MCP server and run risha_api_info.
```

```text
Use the Risha MCP server and show my Risha credit balance.
```

```text
Use the Risha MCP server and list image capabilities.
```

```text
Use Risha MCP to generate a small image of a red apple on a white table.
```

## Use with Claude Code

Claude Code supports MCP servers over stdio. You can add the server using either the CLI or JSON configuration.

### Option A: Claude Code CLI

From the project directory:

```bash
claude mcp add risha \
  --env RISHA_EMAIL="you@example.com" \
  --env RISHA_PASSWORD="your-password" \
  -- node /absolute/path/to/risha-mcp-server/src/index.js
```

Then restart Claude Code or start a new session.

Test prompts:

```text
Use the risha MCP server and run risha_api_info.
```

```text
Use the risha MCP server to show my credit balance.
```

```text
Use the risha MCP server to generate a small image of a robot holding a camera.
```

### Option B: Claude MCP JSON config

If your Claude Code setup uses JSON MCP configuration, add:

```json
{
  "mcpServers": {
    "risha": {
      "command": "node",
      "args": ["/absolute/path/to/risha-mcp-server/src/index.js"],
      "env": {
        "RISHA_EMAIL": "you@example.com",
        "RISHA_PASSWORD": "your-password"
      }
    }
  }
}
```

## Use with Claude Desktop

Add this to your Claude Desktop MCP config:

```json
{
  "mcpServers": {
    "risha": {
      "command": "node",
      "args": ["/absolute/path/to/risha-mcp-server/src/index.js"],
      "env": {
        "RISHA_EMAIL": "you@example.com",
        "RISHA_PASSWORD": "your-password"
      }
    }
  }
}
```

Restart Claude Desktop after editing the config.

## Test with MCP Inspector

```bash
cd risha-mcp-server
npx @modelcontextprotocol/inspector \
  env RISHA_EMAIL="you@example.com" RISHA_PASSWORD="your-password" \
  node src/index.js
```

Open the Inspector URL printed in the terminal and try:

1. `risha_api_info`
2. `risha_credit_balance`
3. `risha_capabilities`
4. `risha_generate_image`

## Typical workflow for agents

1. Call `risha_api_info` to confirm authentication and startup state.
2. Call `risha_credit_balance` to check credits.
3. Call `risha_capabilities` to pick a capability.
4. Use `risha_generate_image` for simple image generation, or `risha_create_generation` for arbitrary capabilities.
5. Use returned public CDN URLs directly. Private media URLs are resolved automatically when possible.

## Notes on generation time

Image/video generation is asynchronous. The MCP server can create a request immediately, but final completion depends on provider queue and model runtime. `risha_generate_image` and `risha_create_generation` poll until completion or timeout.

Default polling values:

- `timeoutSeconds`: `300`
- `pollSeconds`: `5`

## Development

```bash
npm install
node --check src/index.js
npm start
```

Project layout:

```text
risha-mcp-server/
  src/
    index.js       # MCP server implementation
    swagger.json   # Risha Swagger/OpenAPI document
  package.json
  README.md
```

## License

MIT

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct aspect of the Risha API: authentication, API info, operation listing/calling, generation, image generation, media URL resolution, and startup state. No two tools have overlapping purposes.

Naming Consistency5/5

All tools follow the consistent pattern of 'risha_' prefix followed by a verb_noun or noun structure (e.g., risha_create_generation, risha_get_operation, risha_credit_balance). The convention is uniform and predictable.

Tool Count5/5

12 tools is an appropriate number for a server that wraps a generative AI API, covering authentication, information retrieval, API calling, image generation, and media management without being excessive or insufficient.

Completeness4/5

The tool set covers core workflows: login, state inspection, API operation discovery, general API calling, and specific generation/image tasks. A minor gap is the lack of a tool to list past generations, but the surface is otherwise comprehensive.

Maintenance

ActivityInactive
ResponsivenessNo issues