AltText.ai MCP Server
An MCP server that lets AI assistants generate alt text, manage image libraries, and queue alt text generation for web page images using the AltText.ai API.
Works with Claude Desktop, Claude Code, Cursor, Windsurf, and any MCP-compatible client.
Verify this package
This server runs npx -y @alttext_ai/alttext-mcp, which downloads and executes code with your API key in its environment. That's worth a moment of verification before you install — by you or by an AI agent doing the setup. Everything below should match:
The npm scope is @alttext_ai (with an underscore), while the GitHub org is alttextai (no underscore). This is intentional, not a typosquat: the @alttextai npm scope was already taken, so we publish under @alttext_ai. The two names refer to the same official AltText.ai package.
To cryptographically verify the published package was built by this repo's CI — not just trust the metadata — run:
from a project where the package is installed. This validates the registry signature and the npm provenance attestation, which links the tarball to a specific commit and GitHub Actions build. A counterfeit package can forge repository.url and other metadata, but it cannot forge the provenance attestation — so this is the check that actually matters.
(For a quick, weaker cross-reference of the claimed source you can run npm view @alttext_ai/alttext-mcp repository.url, but note that field is publisher-controlled metadata and proves nothing on its own.)
Pinning a version
The setup snippet uses npx -y @alttext_ai/alttext-mcp, which always resolves to the latest published version and re-runs it on every launch. That keeps you current, but it also means a future release runs automatically without review. If you want a reproducible, audited install, pin a specific version:
"args": ["-y", "@alttext_ai/alttext-mcp@1.0.5"]
Run npm audit signatures against the pinned version, and bump it deliberately when you're ready to take a new release.
Setup
Requirements: Node.js 22+ and an AltText.ai API key
Add the server to your MCP client configuration:
{
"mcpServers": {
"alttext-ai": {
"command": "npx",
"args": ["-y", "@alttext_ai/alttext-mcp"],
"env": {
"ALTTEXT_API_KEY": "your-api-key"
}
}
}
}
Where to add this:
| Client | Config file |
|---|
| Claude Desktop | claude_desktop_config.json |
| Claude Code | .mcp.json in your project root |
| Cursor | MCP settings in the Cursor preferences |
| Windsurf | MCP settings in the Windsurf preferences |
The same operations are available as the alttext command, which also manages an account's site API keys with a full-access key. See packages/cli/README.md for commands, flags and exit codes.
Once @alttext_ai/cli is released on npm:
npm install -g @alttext_ai/cli
alttext login
alttext whoami
Until then, build it from a clone of this repo:
npm install
npm run build
npm link --workspace packages/cli
Agent skill
skills/alttext teaches Claude Code, Codex and other coding agents to drive the alttext CLI: checking whoami first, parsing --json, dry-running and asking before a rotate, revoke or delete, keeping tokens out of the conversation, and the reseller workflows for onboarding, billing and leaked keys. The skill contains no credentials, and it tells the agent to have you run alttext login yourself rather than paste a key into chat. It needs the CLI installed.
With npx skills, for any supported agent:
npx skills add alttextai/alttext-mcp --skill alttext
As a Claude Code plugin, from this repo's plugin marketplace:
claude plugin marketplace add alttextai/alttext-mcp
claude plugin install alttext@alttext-ai
Or in one step inside a Claude Code session (2.1.275 or later): /plugin install alttext --marketplace alttextai/alttext-mcp.
From a local clone, pass the clone's path instead: npx skills add ./alttext-mcp --skill alttext, or claude plugin marketplace add ./alttext-mcp.
Account Management
| Tool | Description |
|---|
get_account | Check your credit balance, usage, and account settings. |
update_account | Update account name, webhook URL, or notification email. |
Generate Alt Text
| Tool | Description |
|---|
generate_alt_text | Generate alt text for an image URL. Supports multilingual output, custom prompts, keywords, and character limits. Uses account credits. |
generate_alt_text_from_file | Generate alt text from a local image file. Automatically base64-encodes and uploads. Uses account credits. |
translate_image | Add alt text in a new language for an existing image (by asset_id). Uses account credits. |
Manage Image Library
| Tool | Description |
|---|
list_images | List images in your library with pagination. |
search_images | Search your image library by alt text content. |
get_image | Get details for a specific image by asset ID. |
update_image | Update alt text, tags, or metadata for an image. |
delete_image | Delete an image from your library. |
Bulk Operations
| Tool | Description |
|---|
bulk_create | Bulk generate alt text from a CSV file with image URLs and optional metadata. |
scrape_page | Scan a web page, find images missing alt text, and queue generation. Results are async -- use list_images to check progress. |
Effects and processing
This package uses stdio and runs on the machine launching the MCP client. Image and CSV paths refer to that machine; selected file contents are uploaded to AltText.ai.
Generation and translation use your account credits. Additional languages and image conversion can increase the total. Check get_account before paid work. Generation can overwrite existing alt text when requested; updates replace supplied fields and deletion removes the image from the library.
CSV imports and page scraping queue background processing. An accepted request does not mean generation has finished; inspect the image library and any configured completion notifications. Tool annotations describe effects for clients; they do not enforce confirmation.
Example Prompts
Once configured, just ask your AI assistant:
Account & Credits
Generate Alt Text
- "Generate alt text for https://example.com/photo.jpg"
- "Generate alt text for this image" (with local file)
- "Generate alt text in French and Spanish for this image"
- "Translate image abc123 to German"
Manage Library
- "Search my images for 'product photo'"
- "List my images"
- "Get details for image abc123"
- "Update the alt text for asset abc123"
- "Delete image xyz789"
Bulk Operations
- "Generate alt text for images missing it on https://example.com"
- "Process this CSV file of image URLs" (bulk_create)
Environment Variables
| Variable | Required | Description |
|---|
ALTTEXT_API_KEY | Yes | Your AltText.ai API key |
ALTTEXT_API_BASE_URL | No | Override the API base URL (default: https://alttext.ai/api/v1) |
Development
The repo is an npm workspace: packages/core (private API client, schemas and formatters, bundled into each published package), packages/mcp (@alttext_ai/alttext-mcp) and packages/cli (@alttext_ai/cli, the alttext command).
npm install
npm run check
The root package.json version is the only one to edit. npm run version:stamp copies it into every package and server.json, and CI fails when they drift. A v* tag matching that version publishes both packages.
Tests use mocked fetch calls -- no API key or network access needed.
npm run skills:validate checks each skill's frontmatter and links, and that every alttext command and flag a skill mentions exists in the built CLI. It runs as part of npm run check, after the build.
Hosted deployments must rate-limit POST /register at a trusted edge using the verified client address. The Node service deliberately ignores forwarded client-address headers because accepting them without an authenticated proxy boundary would let callers spoof the rate-limit identity.
The production container and required settings are documented in docs/deployment.md.
License
MIT
Registry publishing
server.json describes the stdio npm package. Its name matches mcpName in packages/mcp/package.json; both versions must match the release being submitted. Publish and verify that exact npm version before running mcp-publisher publish. Registry acceptance and directory approval are separate from an npm release.