{"_id":"@alttext_ai/alttext-mcp","_rev":"5-c56c1c8ef4f54724276cafd08506831e","name":"@alttext_ai/alttext-mcp","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@alttext_ai/alttext-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"author":{"url":"https://alttext.ai","name":"AltText.ai"},"license":"MIT","_id":"@alttext_ai/alttext-mcp@1.0.0","maintainers":[{"name":"joshre","email":"joshre@me.com"}],"homepage":"https://alttext.ai","bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"bin":{"alttext-mcp":"dist/index.js"},"dist":{"shasum":"0e47af4b99c81a31e12b7175189c3e60100c1684","tarball":"https://registry.npmjs.org/@alttext_ai/alttext-mcp/-/alttext-mcp-1.0.0.tgz","fileCount":8,"integrity":"sha512-wYpsvrzYoalb8D6mzGGUvZC39Q9CpZX6SU2trCw4LHvYgB0qvo8WvmxEOdFyB1QjJpA2druFT98gPeKlkl5DEg==","signatures":[{"sig":"MEYCIQCPYKIbNWxFeKqpbNUDnsw1OSvFGQdklaHFJihQfq+F0gIhAJronEPF9Gtlx6z/L/vGzNTbyUO7R77/bfjm7hTfLvje","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35205},"type":"module","engines":{"node":">=18"},"gitHead":"bdac21122b1ff38ae3f491da6df98f4a04fa431f","scripts":{"lint":"eslint src/ test/","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","check":"npm run lint && npm run format:check && npm run build && npm test","watch":"tsc --watch","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepare":"npm run build","lint:fix":"eslint src/ test/ --fix","test:watch":"vitest","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts'"},"_npmUser":{"name":"joshre","email":"joshre@me.com"},"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"_npmVersion":"11.8.0","description":"MCP server for AltText.ai — generate alt text, manage image libraries, and audit web pages for accessibility","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.25.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.4.0","@eslint/js":"^9.0.0","typescript":"^5.8.2","@types/node":"^25.2.3","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alttext-mcp_1.0.0_1771607863063_0.16067584463437656","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alttext_ai/alttext-mcp","version":"1.0.1","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"author":{"url":"https://alttext.ai","name":"AltText.ai"},"license":"MIT","_id":"@alttext_ai/alttext-mcp@1.0.1","maintainers":[{"name":"joshre","email":"joshre@me.com"}],"homepage":"https://alttext.ai","bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"bin":{"alttext-mcp":"dist/index.js"},"dist":{"shasum":"7b4de535040e195f9cc85cc9a8d2368624409ce4","tarball":"https://registry.npmjs.org/@alttext_ai/alttext-mcp/-/alttext-mcp-1.0.1.tgz","fileCount":8,"integrity":"sha512-N89lv96TTEHt9nHH7wz+TBlAmF7KlzpJt47ESqZUnYsvQKfCkofkgqWIQR8600hGghZC5B3P3v3ZOb18K34xcA==","signatures":[{"sig":"MEQCIDPvOi4I3olsHPsMHm2xYVQpXWPno4eG49gOS0VWrk8hAiA8Ee5Vwag0qStaz1bwmLoK5wlwLSpCfrJoFhSZG4x7AQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35205},"type":"module","engines":{"node":">=18"},"gitHead":"bdac21122b1ff38ae3f491da6df98f4a04fa431f","scripts":{"lint":"eslint src/ test/","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","check":"npm run lint && npm run format:check && npm run build && npm test","watch":"tsc --watch","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepare":"npm run build","lint:fix":"eslint src/ test/ --fix","test:watch":"vitest","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts'"},"_npmUser":{"name":"joshre","email":"joshre@me.com"},"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"_npmVersion":"11.8.0","description":"MCP server for AltText.ai — generate alt text, manage image libraries, and audit web pages for accessibility","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.25.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.4.0","@eslint/js":"^9.0.0","typescript":"^5.8.2","@types/node":"^25.2.3","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alttext-mcp_1.0.1_1771608079209_0.8088550092923483","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alttext_ai/alttext-mcp","version":"1.0.2","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"author":{"url":"https://alttext.ai","name":"AltText.ai"},"license":"MIT","_id":"@alttext_ai/alttext-mcp@1.0.2","maintainers":[{"name":"joshre","email":"joshre@me.com"}],"homepage":"https://alttext.ai","bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"bin":{"alttext-mcp":"dist/index.js"},"dist":{"shasum":"791a1d6e491c8100169f05ad3579f49469361a0d","tarball":"https://registry.npmjs.org/@alttext_ai/alttext-mcp/-/alttext-mcp-1.0.2.tgz","fileCount":8,"integrity":"sha512-r+BJWynMM+E0wqp8ay2i9N0+g4B2qWvbhzQONwnAFti1OwSFyx8ekG0YxWsM39l5wbTjZN6Sp7deHHNfC6xnjQ==","signatures":[{"sig":"MEQCIE/gIuUE6PrLRrDb0KtlIr6bGu4A5UXXtELDXk0WoGd6AiAP64ytW9bjd1frtwoWJbwuwGGYLkydTGldmgKagfvVWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35207},"type":"module","engines":{"node":">=18"},"gitHead":"bdac21122b1ff38ae3f491da6df98f4a04fa431f","scripts":{"lint":"eslint src/ test/","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","check":"npm run lint && npm run format:check && npm run build && npm test","watch":"tsc --watch","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepare":"npm run build","lint:fix":"eslint src/ test/ --fix","test:watch":"vitest","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts'"},"_npmUser":{"name":"joshre","email":"joshre@me.com"},"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"_npmVersion":"11.8.0","description":"MCP server for AltText.ai — generate alt text, manage image libraries, and audit web pages for accessibility","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.25.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.4.0","@eslint/js":"^9.0.0","typescript":"^5.8.2","@types/node":"^25.2.3","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alttext-mcp_1.0.2_1771608175279_0.3271152707868268","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@alttext_ai/alttext-mcp","version":"1.0.4","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"author":{"url":"https://alttext.ai","name":"AltText.ai"},"license":"MIT","_id":"@alttext_ai/alttext-mcp@1.0.4","maintainers":[{"name":"joshre","email":"joshre@me.com"}],"homepage":"https://alttext.ai","bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"bin":{"alttext-mcp":"dist/index.js"},"dist":{"shasum":"64ddc19eb5bf594fb2b713df49e643b320179748","tarball":"https://registry.npmjs.org/@alttext_ai/alttext-mcp/-/alttext-mcp-1.0.4.tgz","fileCount":8,"integrity":"sha512-/aYBiY8mxQ8HRofjKtiq9nj0TOATfMFey4H4ESYb4B/AnDBGmDiTl0GwG+KtANu4neHohe6XTwjQRCkQbTwJ8w==","signatures":[{"sig":"MEYCIQCK6EombaA5UKK3rDzFqCLl6aZZKcW8wT8DOm7nnNqXZgIhAMnR3e/fGliOIb00MnbChiSDnXY8hQ0BjtZZwfkNAxi4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alttext_ai%2falttext-mcp@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37490},"type":"module","engines":{"node":">=18"},"gitHead":"77f2793e634a9fd03c8c5395a1016fe6b848c049","scripts":{"lint":"eslint src/ test/","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","check":"npm run lint && npm run format:check && npm run build && npm test","watch":"tsc --watch","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepare":"npm run build","lint:fix":"eslint src/ test/ --fix","test:watch":"vitest","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts'"},"_npmUser":{"name":"joshre","email":"joshre@me.com"},"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for AltText.ai — generate alt text, manage image libraries, and audit web pages for accessibility","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.25.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.4.0","@eslint/js":"^9.0.0","typescript":"^5.8.2","@types/node":"^25.2.3","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alttext-mcp_1.0.4_1782844192404_0.8016683821721069","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"_id":"@alttext_ai/alttext-mcp@1.0.5","bin":{"alttext-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"dist":{"shasum":"c1d3e5995336e0e15c681667a214d2461b14d875","tarball":"https://registry.npmjs.org/@alttext_ai/alttext-mcp/-/alttext-mcp-1.0.5.tgz","fileCount":8,"integrity":"sha512-g77eMLt3uTZUAZAJAtoeEPeBLYrEvoDUKnIuH3jknDe7zIpfkZAZNsgp09hfhrlntiyXTxIpL6WJF7u0rO3S/Q==","signatures":[{"sig":"MEYCIQDKJGoaGMBzkb6zzjpYztenaLtrgLykkFwQXyIFPMcLhAIhALylvhpQESYAIqVr6PJtoTDQ5hMlB671I/onAhENG0aL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDxWtVD/6dse7PuVKjLzzwMjWGZuxzZsftfFvLEHAfFWwIhAI0ax/fV4apgeyEqBwEiTpZRrYp5qhYUuWsNLs8g90oV"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alttext_ai%2falttext-mcp@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":40917},"name":"@alttext_ai/alttext-mcp","type":"module","author":{"url":"https://alttext.ai","name":"AltText.ai"},"engines":{"node":">=18"},"gitHead":"1e9eca651a73a33a8a0749c5230aa18fc8bfdf40","license":"MIT","mcpName":"io.github.alttextai/alttext-mcp","scripts":{"lint":"eslint src/ test/","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","check":"npm run lint && npm run format:check && npm run build && npm test","watch":"tsc --watch","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepare":"npm run build","lint:fix":"eslint src/ test/ --fix","test:watch":"vitest","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts'"},"version":"1.0.5","_npmUser":{"name":"joshre","email":"joshre@me.com"},"homepage":"https://alttext.ai","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Generate alt text, translate descriptions, and manage your AltText.ai image library.","directories":{},"maintainers":[{"name":"joshre","email":"joshre@me.com"}],"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.3.6","@modelcontextprotocol/sdk":"^1.25.2"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.4.0","@eslint/js":"^9.0.0","typescript":"^5.8.2","@types/node":"^25.2.3","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/alttext-mcp_1.0.5_1789667369251_0.17631393548018415"}}},"time":{"created":"2026-02-20T17:17:42.957Z","modified":"2026-09-17T17:49:29.708Z","1.0.0":"2026-02-20T17:17:43.201Z","1.0.1":"2026-02-20T17:21:19.345Z","1.0.2":"2026-02-20T17:22:55.409Z","1.0.4":"2026-06-30T18:29:52.533Z","1.0.5":"2026-09-17T17:49:29.334Z"},"bugs":{"url":"https://github.com/alttextai/alttext-mcp/issues"},"author":{"url":"https://alttext.ai","name":"AltText.ai"},"license":"MIT","homepage":"https://alttext.ai","keywords":["mcp","model-context-protocol","alt-text","accessibility","a11y","image","ai","alttext"],"repository":{"url":"git+https://github.com/alttextai/alttext-mcp.git","type":"git"},"description":"Generate alt text, translate descriptions, and manage your AltText.ai image library.","maintainers":[{"name":"joshre","email":"joshre@me.com"}],"readme":"# AltText.ai MCP Server\n\nAn [MCP](https://modelcontextprotocol.io/) server that lets AI assistants generate alt text, manage image libraries, and queue alt text generation for web page images using the [AltText.ai](https://alttext.ai) API.\n\nWorks with Claude Desktop, Claude Code, Cursor, Windsurf, and any MCP-compatible client.\n\n## Verify this package\n\nThis 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:\n\n| Signal | Value |\n|--------|-------|\n| npm package | [`@alttext_ai/alttext-mcp`](https://www.npmjs.com/package/@alttext_ai/alttext-mcp) |\n| Source repository | [`github.com/alttextai/alttext-mcp`](https://github.com/alttextai/alttext-mcp) |\n| Publisher | AltText.ai |\n| Provenance | Published from this repo's CI with [npm provenance](https://docs.npmjs.com/generating-provenance-statements) — npm shows a verified build badge linking the package to this exact commit |\n\n**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.\n\nTo cryptographically verify the published package was built by this repo's CI — not just trust the metadata — run:\n\n```sh\nnpm audit signatures\n```\n\nfrom 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.\n\n(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.)\n\n### Pinning a version\n\nThe 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:\n\n```json\n\"args\": [\"-y\", \"@alttext_ai/alttext-mcp@1.0.5\"]\n```\n\nRun `npm audit signatures` against the pinned version, and bump it deliberately when you're ready to take a new release.\n\n## Setup\n\n**Requirements:** Node.js 18+ and an [AltText.ai API key](https://alttext.ai/account/api)\n\nAdd the server to your MCP client configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"alttext-ai\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@alttext_ai/alttext-mcp\"],\n      \"env\": {\n        \"ALTTEXT_API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n**Where to add this:**\n\n| Client | Config file |\n|--------|-------------|\n| Claude Desktop | `claude_desktop_config.json` |\n| Claude Code | `.mcp.json` in your project root |\n| Cursor | MCP settings in the Cursor preferences |\n| Windsurf | MCP settings in the Windsurf preferences |\n\n## Tools\n\n### Account Management\n| Tool | Description |\n|------|-------------|\n| `get_account` | Check your credit balance, usage, and account settings. |\n| `update_account` | Update account name, webhook URL, or notification email. |\n\n### Generate Alt Text\n| Tool | Description |\n|------|-------------|\n| `generate_alt_text` | Generate alt text for an image URL. Supports multilingual output, custom prompts, keywords, and character limits. Uses account credits. |\n| `generate_alt_text_from_file` | Generate alt text from a local image file. Automatically base64-encodes and uploads. Uses account credits. |\n| `translate_image` | Add alt text in a new language for an existing image (by asset_id). Uses account credits. |\n\n### Manage Image Library\n| Tool | Description |\n|------|-------------|\n| `list_images` | List images in your library with pagination. |\n| `search_images` | Search your image library by alt text content. |\n| `get_image` | Get details for a specific image by asset ID. |\n| `update_image` | Update alt text, tags, or metadata for an image. |\n| `delete_image` | Delete an image from your library. |\n\n### Bulk Operations\n| Tool | Description |\n|------|-------------|\n| `bulk_create` | Bulk generate alt text from a CSV file with image URLs and optional metadata. |\n| `scrape_page` | Scan a web page, find images missing alt text, and queue generation. Results are async -- use `list_images` to check progress. |\n\n## Effects and processing\n\nThis 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.\n\nGeneration 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.\n\nCSV 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.\n\n## Example Prompts\n\nOnce configured, just ask your AI assistant:\n\n### Account & Credits\n- \"How many credits do I have left?\"\n- \"Update my webhook URL to https://example.com/webhook\"\n\n### Generate Alt Text\n- \"Generate alt text for https://example.com/photo.jpg\"\n- \"Generate alt text for this image\" (with local file)\n- \"Generate alt text in French and Spanish for this image\"\n- \"Translate image abc123 to German\"\n\n### Manage Library\n- \"Search my images for 'product photo'\"\n- \"List my images\"\n- \"Get details for image abc123\"\n- \"Update the alt text for asset abc123\"\n- \"Delete image xyz789\"\n\n### Bulk Operations\n- \"Generate alt text for images missing it on https://example.com\"\n- \"Process this CSV file of image URLs\" (bulk_create)\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `ALTTEXT_API_KEY` | Yes | Your [AltText.ai API key](https://alttext.ai/account/api) |\n| `ALTTEXT_API_BASE_URL` | No | Override the API base URL (default: `https://alttext.ai/api/v1`) |\n\n## Development\n\n```sh\nnpm install\nnpm run build\nnpm test\nnpm run lint\n```\n\nTests use mocked `fetch` calls -- no API key or network access needed.\n\n## License\n\nMIT\n\n## Registry publishing\n\n`server.json` describes the stdio npm package. Its name matches `mcpName` in `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.\n","readmeFilename":"README.md"}