nexus-mcp
Provides tools for interacting with Nexus Mods, enabling browsing games and mods, searching mods, downloading files with checksum verification, and managing endorsements, comments, collections, and user preferences.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nexus-mcp search for realistic lighting mods for Skyrim"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
nexus-mcp
140 MCP tools for Nexus Mods — wraps the official REST API v1 and GraphQL API v2 as a Model Context Protocol server (Python + FastMCP, stdio transport). Lets any MCP client (Claude Desktop, opencode, Cursor, ...) browse games, inspect mods and files, run free-text searches, download mod files with checksum verification, manage endorsements, comments, collections, and user preferences.
Highlights
Full API coverage — 74 read tools + 66 mutations across v1 REST and v2 GraphQL. Includes things v1 doesn't offer: free-text mod search, batch mod lookups, comment threads, collection lifecycle, and quota-free GraphQL reads.
Built-in TTL cache — repeated identical GETs within a session don't consume quota (games 1h, mod/file data 5 min, GraphQL POSTs 60 s). Personal state (
/user/*) is never cached.Dual authentication — personal API key out of the box; optional OAuth2 (PKCE S256) with auto-refresh for user-context mutations that API keys cannot perform.
Safe downloads —
nexus_download_mod_filestreams from the CDN to disk, verifies MD5 + SHA-256 checksums against the expected hashes, and enforces a configurable size cap.Rate-limit transparency — every v1 response carries an
_rlsnapshot of Nexus' hourly/daily limit headers.
Related MCP server: nexus-mcp
Install
# uv (recommended for MCP servers)
uvx --from nexus-mods-mcp nexus-mcp
# pipx
pipx install nexus-mods-mcp
# pip
pip install nexus-mods-mcpOr from a cloned repository:
pip install -r requirements.txt
python -m nexus_mcpWorks with every MCP harness
Create an API key at https://www.nexusmods.com/users/myaccount?tab=api%20access, then pick your harness below. The server is a single stdio process — no ports, no daemons, no database.
Zero-install (recommended): run from PyPI with uvx — nothing to clone,
no venv to manage, auto-fetched on first run:
{
"mcpServers": {
"nexus": {
"command": "uvx",
"args": ["--from", "nexus-mods-mcp", "nexus-mcp"],
"env": { "NEXUS_API_KEY": "<your-key>" }
}
}
}If you installed locally (pipx install nexus-mods-mcp),
use "command": "nexus-mcp" without the uvx wrapper instead.
claude mcp add nexus -e NEXUS_API_KEY=<your-key> -- uvx --from nexus-mods-mcp nexus-mcp{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"nexus": {
"type": "local",
"command": ["uvx", "--from", "nexus-mods-mcp", "nexus-mcp"],
"enabled": true,
"environment": {
"NEXUS_API_KEY": "<your-key>"
}
}
}
}{
"mcpServers": {
"nexus": {
"command": "uvx",
"args": ["--from", "nexus-mods-mcp", "nexus-mcp"],
"env": {
"NEXUS_API_KEY": "<your-key>"
}
}
}
}Same shape as the generic JSON above. Paste the mcpServers block into:
Cursor — .cursor/mcp.json · Windsurf — ~/.codeium/windsurf/mcp_config.json ·
Cline — extension MCP server settings.
{
"servers": {
"nexus": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "nexus-mods-mcp", "nexus-mcp"],
"env": {
"NEXUS_API_KEY": "<your-key>"
}
}
}
}{
"mcpServers": {
"nexus": {
"command": "uvx",
"args": ["--from", "nexus-mods-mcp", "nexus-mcp"],
"env": {
"NEXUS_API_KEY": "<your-key>"
}
}
}
}[mcp_servers.nexus]
command = "uvx"
args = ["--from", "nexus-mods-mcp", "nexus-mcp"]
env = { "NEXUS_API_KEY" = "<your-key>" }Environment variables
Variable | Required | Description |
| yes | Personal API key from Nexus Mods |
| no | OAuth client ID (see below) |
| no | Only for non-public OAuth apps |
| no | Defaults to |
| no | Token store path, defaults to |
| no | Tool profile: |
Authentication
API key works for all public reads and most mutations. Note that the key itself is
not an authorization scope: some user-context mutations (e.g.
nexus_update_mod_direct_download) are rejected with API-key auth even for the mod's
owner — Nexus requires an OAuth user context for those.
OAuth (optional). Nexus has no self-service OAuth app registration; email
support@nexusmods.com with your app name, description, logo, source link, and callback
URI to obtain a client_id. Then run the two-step flow:
nexus_oauth_login→ returns anauthorize_url(state + PKCE challenge); open it, log in, and copy thecodefrom the redirect URL.nexus_oauth_exchange(code)→ exchanges the code for tokens, persists them toNEXUS_OAUTH_TOKEN_FILE, and validates your identity.
Tokens last ~6 h and auto-refresh (a 4xx refresh response is treated as revocation and
falls back to API-key auth). Companion tools: nexus_oauth_status, nexus_oauth_refresh,
nexus_oauth_logout. The public scope is sufficient; Bearer auth is accepted on both
v1 REST and v2 GraphQL.
Rate limits & quota
v1 REST: 2000 requests/hour, 20 000/day per key. Every v1 response includes an
_rlsnapshot (X-RL-*headers) so agents can self-throttle.v2 GraphQL has its own rate-limit pool and does not consume v1 quota — prefer v2 tools (
nexus_search_mods,nexus_get_mod_v2,nexus_get_mods_batch, ...) for searches and public data.The server-side TTL cache (see Highlights) further reduces quota usage for repeated reads within a session.
Tool catalog
v1 REST (core)
Tool | Description |
| Check API key + account info (exempt from rate limits) |
| Game catalog (substring filter) / one game + categories |
| Mod details (endorsements, downloads, description) / changelog per version |
| 10 newest / updated / trending mods for a game |
| Mods with activity in the last |
| Mod file list (category filter) / one file's details (MD5, size, version) |
| Short-lived CDN download URL (non-premium needs |
| Stream a file to disk (MD5+SHA-256 verification, |
| Identify a mod/file from an MD5 hash |
| Manage tracked mods |
| Manage endorsements |
v2 GraphQL (does not consume v1 quota)
Tool | Description |
| Free-text mod search (wildcard) + game/endorsement/download filters + sort + pagination |
| Full mod details: raw BBCode description, tags, requirements, complete file list |
| Resolve many mods in one query: |
| Users who endorsed a mod (cursor pagination) |
| Game search / rich game details (genre, forum, counts, Vortex support) |
| Resolve a game display name (e.g. 'Skyrim Special Edition') to its |
| File lists via v2 (by domain/modId or by uid) |
| User search (fuzzy) / public profile by id or username / exact username lookup |
| Collection search / details by slug / single revision |
| Collection categories (per-game or global) |
| Tag taxonomy |
| Comment reads (⚠️ |
| Static catalog of earnable mod badges |
| Site/game news, interviews, features (filter by category/game) |
| Raw GraphQL escape hatch / schema introspection |
| Account state reads |
| Media + legacy lookups |
| Site-wide media search (⚠️ Nexus endpoint is intermittently flaky — retry) |
| Site preferences (emails, default tabs, download location...) |
| Donation Points preferences |
| Favourite games |
| Ignored users |
| Blocked tags |
| Track/untrack users for update notifications |
| Kudos |
| Comment likes |
| Comment mutations (nested replies via |
| Private messages (multipart attachments) |
| Profile updates |
| CDN speedtest endpoints |
| Donation Points reporting (⚠️ some data is hidden under API-key auth — OAuth required) |
| Upload activity with scan status |
Collections, moderation & misc mutations
Tool | Description |
| Create/edit collections (manifest, BBCode description) |
| Revision lifecycle |
| Collection visibility lifecycle |
| Revision changelogs |
| Tag management (moderator) |
| Collection content management |
| Close bug reports on your collections |
| Submit fixes for moderated content |
| Comment moderation (moderator/owner) |
| Donation Points earning control (moderator) |
| App metrics (e.g. Vortex collection installs) |
| Toggle direct downloads on your own mods (OAuth required) |
| Age verification flows |
| Presigned upload URLs |
| OAuth2 flow (PKCE S256, auto-refresh, apikey fallback) |
API quirks worth knowing
domain_nameis the lowercase URL slug (e.g.forzahorizon6,skyrimse) — not the display name.Download links are short-lived; don't cache them. Non-premium accounts must pass the
key/expirespair extracted from a.nxmlink generated on the website.Preference mutations (
ignore_user,block_tag, ...) apply immediately but list reads can lag a few seconds behind (eventual consistency).nexus_discard_commentis effectively one-way under API-key auth: restoring requires OAuth Bearer auth.The v1 categories endpoint (
/v1/games/{domain}/categories.json) was removed by Nexus — categories are only available via v2.nexus_search_commentscurrently returns HTTP 500 from Nexus itself, regardless of parameters;nexus_get_comment_threadis the working alternative.Web scraping (nexus_scrape_page, nexus_scrape_mod_page, nexus_scrape_mod_posts): read public nexusmods.com pages without an API key and consuming no quota - HTTPS only, SSRF-guarded; some pages may still be Cloudflare-blocked, in which case use the API tools instead.
Development
pip install -e ".[dev]" # editable install with pytest + ruff
python -m pytest # 95-test suite,, fully offline (mocked HTTP)
python -m ruff check nexus_mcp tests
python -m nexus_mcp # run on stdioCI runs on every push: ruff lint, pytest across ubuntu/windows (Python 3.10–3.12),
pip-audit, build + twine check + wheel smoke test, and an optional live API smoke test.
Tagged releases (v*) publish to PyPI automatically.
Contributing
Contributions are welcome! See CONTRIBUTING.md for setup, the tool-authoring checklist, and conventions. Bug reports and feature requests use the issue templates; questions and ideas go to Discussions; security issues go through private vulnerability reporting.
License
Available Tools
135 toolsnexus_abstain_endorsementADestructive
Withdraw or abstain from an endorsement for a mod.
Returns: JSON {message: ..., status: "Abstained"}.
Inputs: mod_id (required), version (required), domain_name (required). Returns: result
nexus_add_badge_to_collectionAIdempotent
Award a badge to a collection (moderator permissions required) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: badge_id (required), collection_id (required). Returns: result
nexus_add_favourite_gameAIdempotent
Add a game to your favourites via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {addFavouriteGame: {success}} or an error string.
Inputs: game_id (required). Returns: result
nexus_block_mods_from_earning_dpADestructive
Block a user's mods from earning Donation Points via v2 GraphQL.
Requires moderator permissions when targeting another user.
Returns: JSON {success} or an error string.
Inputs: user_id. Returns: result
nexus_block_tagAIdempotent
Block a tag for the current user via v2 GraphQL - hides matching content.
Personal preference only: no public side effect. Reversible with nexus_unblock_tag. Only blockable tags can be blocked. NOTE: preference mutations apply immediately but list reads (nexus_get_blocked_tags) can lag several seconds - wait before re-reading to confirm.
Returns: JSON {blockTag: {success}} or an error string.
Inputs: tag_id (required). Returns: result
nexus_clear_comment_moderation_statusBIdempotent
Clear a comment's moderation status (moderator permissions) via v2 GraphQL.
Returns: JSON {comment: {id}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_clear_comment_thread_moderation_statusAIdempotent
Clear a comment thread's moderation status (moderator permissions) via v2 GraphQL.
Returns: JSON {commentThread: {id}} or an error string.
Inputs: comment_thread_id (required). Returns: result
nexus_close_collection_bug_reportADestructiveIdempotent
Close a bug report on your collection via v2 GraphQL.
Returns: JSON {collectionBugReport: {id, status, closureReason, closedAt}}.
Inputs: bug_report_id (required), closure_reason (required). Returns: result
nexus_create_changelogA
Create a changelog entry for a collection revision (must own it) via v2 GraphQL.
Returns: JSON {success, changelogId} or an error string.
Inputs: description (required), revision_id (required). Returns: result
nexus_create_collectionA
Create a new collection and its first draft revision (v2 GraphQL).
Either build the payload from the individual params or pass the full CollectionPayload JSON via collection_data_json (shape: {adultContent, collectionManifest: {info: {...}, mods: [...]}, collectionSchemaId}).
Returns: JSON {success, collectionId, revisionId} or an error string.
Inputs: name (required), author (required), domain_name (required), summary, +8 more. Returns: result
nexus_create_commentA
Post a comment in a thread via v2 GraphQL — top-level by default, or a nested reply when reply_to_id is given.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota. Find thread IDs on mod pages (?tab=posts); forum threads and mod posts have distinct thread IDs.
Returns: JSON {createComment: {comment: {id, body, ...}}} or an error string.
Inputs: body (required), thread_id (required), reply_to_id. Returns: result
nexus_create_messageA
Send a private message to one or more users via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: to (required), body (required), title (required). Returns: result
nexus_create_or_update_revisionAIdempotent
Create a new draft revision or update the existing draft (v2 GraphQL).
Pass mods_json (or the full payload via collection_data_json) to replace the revision's mod list; omit mods_json to keep it unchanged.
Returns: JSON {success, collectionId, revisionId, revisionNumber} or an error string.
Inputs: collection_id (required), name, author, summary, +8 more. Returns: result
nexus_create_tagA
Create a new tag (moderator permissions may be required) via v2 GraphQL.
Returns: JSON {success, tag: {id, name}} or an error string.
Inputs: name (required), adult, game_ids, global_tag, +1 more. Returns: result
nexus_discard_collectionADestructive
Discard (soft-delete) an entire collection (must own it) via v2 GraphQL.
DESTRUCTIVE: discards the collection. Prefer nexus_unlist_collection.
Returns: JSON {success} or an error string.
Inputs: reason (required), collection_id (required). Returns: result
nexus_discard_commentADestructive
Discard (soft-delete) a comment via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota. Discarded comments are removed from public view. Only the author (or a moderator) can discard a comment. NOTE: restoring via nexus_restore_comment REQUIRES OAuth Bearer auth - Nexus denies restore under apikey-only auth, so with an API key alone discard is effectively one-way.
Returns: JSON {discardComment: {comment: {id, isDiscarded, discardedAt}}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_discard_revisionADestructive
Discard a collection revision (must own the collection) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: collection_id (required), revision_number (required), reason. Returns: result
nexus_discard_tagADestructive
Discard (soft-delete) a tag (moderator permissions may be required) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: tag_id (required). Returns: result
nexus_download_mod_fileA
Resolve a mod file's CDN link and stream it to a local file.
Downloads the actual file behind nexus_get_download_link, saving it to disk with MD5 + SHA-256 checksums (verify MD5 against nexus_get_file_info). Premium accounts can omit key/expires; non-premium accounts MUST pass the key/expires pair from a .nxm download link generated on the Nexus website.
Returns: JSON {file, bytes, md5, sha256, mirror, _rl} or an error string.
Inputs: mod_id (required), file_id (required), domain_name (required), key, +3 more. Returns: result
nexus_edit_collectionAIdempotent
Edit a collection's metadata (must own the collection) via v2 GraphQL.
Only the provided fields are changed; omitted fields stay as-is.
Returns: JSON {success, collection: {id, name, slug}} or an error string.
Inputs: collection_id (required), name, summary, category_id, +3 more. Returns: result
nexus_edit_commentAIdempotent
Edit the body of your own comment via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota. Only the comment's author can edit it.
Returns: JSON {updateComment: {comment: {id, body, ...}}} or an error string.
Inputs: body (required), comment_id (required). Returns: result
nexus_endorse_modA
Endorse a mod on behalf of the authenticated account.
Constraints: the account must have downloaded the mod, and Nexus enforces a 15-minute cooldown after the download before endorsing (TOO_SOON_AFTER_DOWNLOAD).
Returns: JSON {message: "Updated to: Endorsed", status: "Endorsed"}.
Inputs: mod_id (required), version (required), domain_name (required). Returns: result
nexus_get_age_verification_infoARead-onlyIdempotent
Get a user's age verification status (v2 GraphQL).
Returns: JSON {verified, externalVerificationIds: [{createdAt, externalVerificationId}]}.
Inputs: user_id. Returns: result
nexus_get_api_applicationsARead-onlyIdempotent
List the authenticated account's registered API applications (v2 GraphQL).
Returns: JSON list of {active, id, key, name, slug, summary}.
Inputs: no named parameters. Returns: result
nexus_get_badgesARead-onlyIdempotent
List all badges a mod can earn (e.g. 'Top pick', 'Easy install').
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Static catalog - cache the result in your workflow.
Returns: JSON {badges: [{id, name, description}]}.
Inputs: no named parameters. Returns: result
nexus_get_blocked_tagsARead-onlyIdempotent
Get the current user's blocked tags via v2 GraphQL.
Blocked tags hide matching mods/collections from your searches. Find tag IDs with nexus_get_tags / nexus_search_mods.
Returns: JSON array of tags: {id, name, global, blockable, searchable, parentId}.
Inputs: exclude_adult. Returns: result
nexus_get_categoriesARead-onlyIdempotent
Get mod categories (per-game or global) via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Provide exactly one of domain_name or is_global. Note: these are collection-style categories (Total Overhaul, Themed, Vanilla Plus, ...) - per-game lists may be sparse for newer games.
Returns: JSON list [{id, name, parentId, description, approved, ...}].
Inputs: is_global, domain_name. Returns: result
nexus_get_category_by_idARead-onlyIdempotent
Get a single collection category by ID (v2 GraphQL).
Returns: JSON {id, name, description, parentId, approved, createdAt, updatedAt}.
Inputs: category_id (required). Returns: result
nexus_get_collectionARead-onlyIdempotent
Get full details of a mod collection by slug via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. v1 REST has no collection detail endpoint.
Returns: JSON {slug, name, summary, description (BBCode), endorsements, downloads, ratings, game, author, tags, category}.
Inputs: slug (required). Returns: result
nexus_get_collection_gamesARead-onlyIdempotent
List games that support collections (v2 GraphQL).
Returns: JSON list of {id, name, domainName, modCount, collectionCount}.
Inputs: no named parameters. Returns: result
nexus_get_collection_revisionARead-onlyIdempotent
Get a specific collection revision (mod count, sizes, status) via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota.
Returns: JSON {id, revisionNumber, revisionStatus, status, adultContent, latest, overallRating, totalDownloads, uniqueDownloads, modCount, totalSize, collection}.
Inputs: slug (required), revision, domain_name, view_adult_content. Returns: result
nexus_get_collection_revision_upload_urlARead-onlyIdempotent
Request a presigned URL for uploading a collection revision bundle (v2 GraphQL).
Returns: JSON {url, uuid}.
Inputs: no named parameters. Returns: result
nexus_get_commentARead-onlyIdempotent
Get a single comment by ID via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota.
Returns: JSON {id, body, createdAt, updatedAt, likesCount, isPinned, creator}.
Inputs: comment_id (required). Returns: result
nexus_get_comment_threadARead-onlyIdempotent
Get a comment thread with all top-level comments and their replies.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Useful to read replies on threads where nexus_search_comments is unavailable (that endpoint is currently broken upstream).
NOTE: only thread IDs returned by the GraphQL API itself resolve (e.g. from nexus_search_mods-related queries or createComment). Thread IDs scraped from mod-page posts-tab HTML do NOT resolve ("not found").
Returns: JSON {id, comments: {totalCount, nodes: [{id, body, createdAt, likesCount, isPinned, creator, replies: {totalCount, nodes}}]}}.
Inputs: thread_id (required). Returns: result
nexus_get_current_warningsARead-onlyIdempotent
Get the current user's unread moderation warnings and global notices (v2 GraphQL).
Returns: JSON {unreadWarnings: [{id, category, date, isRead, link, publicReason, reason, postId, removedDate, removedReason}], unreadGlobalNotices: [{content, date}]}.
Inputs: no named parameters. Returns: result
nexus_get_download_linkARead-only
Get a short-lived download URL for a mod file from the Nexus CDN.
Premium accounts can omit key/expires. Non-premium accounts MUST extract 'key' and 'expires' from a .nxm download link (nxm://{domain}/mods/{mod}/ files/{file}?key=...&expires=...) generated on the Nexus website.
Returns: JSON array of {URI, name, short_name} mirrors - the first entry is the preferred location. Links are short-lived; do not cache them.
Inputs: mod_id (required), file_id (required), domain_name (required), key, +1 more. Returns: result
nexus_get_endorsementsARead-onlyIdempotent
List the authenticated account's endorsement history.
Returns: JSON array of {mod_id, domain_name, date (epoch), version, status ('Undecided' | 'Abstained' | 'Endorsed')}.
Inputs: no named parameters. Returns: result
nexus_get_external_videoARead-onlyIdempotent
Resolve an external video URL to embed metadata (v2 GraphQL).
Returns: JSON {id, title, platform, embedUrl, thumbnailUrl}.
Inputs: url (required). Returns: result
nexus_get_favourite_gamesARead-onlyIdempotent
Get the authenticated user's favourite games via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON array of games: {id, name, domainName, genre, modCount, collectionCount}.
Inputs: no named parameters. Returns: result
nexus_get_file_hashBRead-onlyIdempotent
Look up which mod file matches an MD5 hash (v2 GraphQL).
Returns: JSON list of {md5, fileName, fileType, fileSize, gameId, modFileId, createdAt}.
Inputs: md5 (required). Returns: result
nexus_get_file_hashesARead-onlyIdempotent
Look up which mod files match a batch of MD5 hashes (v2 GraphQL).
Returns: JSON list of {md5, fileName, fileType, fileSize, gameId, modFileId, createdAt}.
Inputs: md5s (required). Returns: result
nexus_get_file_infoARead-onlyIdempotent
Get details for a single file of a mod: version, size, MD5, virus scan link, changelog.
Inputs: mod_id (required), file_id (required), domain_name (required). Returns: result
nexus_get_files_by_uidARead-onlyIdempotent
Get mod file lists by mod UID(s) via v2 GraphQL - no domain/modId pair needed.
Ideal when you only have the uid (e.g. from a .nxm link or your own mod pipeline). Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. NOTE: the response does NOT include domainName/modId - resolve the owning game/mod separately (e.g. nexus_search_by_md5) before calling the download tools.
Returns: JSON {totalFiles, _returned, files: [{fileId, name, version, category, sizeInBytes, totalDownloads, date, description}]}.
Inputs: uids (required), count, offset. Returns: result
nexus_get_files_v2ARead-onlyIdempotent
Get the complete file list of a mod via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Same data as nexus_get_mod_files but from v2 and therefore quota-free on the v1 pool.
Returns: JSON {totalFiles, _returned, files: [{fileId, name, version, category, sizeInBytes, totalDownloads, date, description}]}.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_get_gameARead-onlyIdempotent
Get details for one game: stats, file counts, download counts, and its file/mod categories.
Returns: JSON object with game info including a 'categories' list (category_id, name, parent_category).
Inputs: domain_name (required). Returns: result
nexus_get_game_artworkARead-onlyIdempotent
Get the current game artwork schema URLs (v2 GraphQL).
Returns: JSON {schemaV1: {tile, tileBlurred}, schemaV2: {hero, thumbnail, tile}}.
Inputs: no named parameters. Returns: result
nexus_get_gamesARead-onlyIdempotent
List all games on Nexus Mods with their domain_name, mod counts, and file counts.
Use this to find the correct lowercase domain_name slug for other tools.
Returns: JSON array of games: {id, domain_name, name, genre, mods, file_count, downloads, approved_date, collections}. With '_rl' rate-limit snapshot.
Inputs: filter, include_unapproved. Returns: result
nexus_get_game_v2ARead-onlyIdempotent
Get rich game details via v2 GraphQL: mod/download/collection counts, genre, forum URL, Vortex support.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota.
Returns: JSON game object, or {error: ...} for unknown domains.
Inputs: domain_name (required). Returns: result
nexus_get_ignored_usersARead-onlyIdempotent
Get the current user's ignored (muted) users via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON array of users: {memberId, name, avatar, viewerHasIgnored}.
Inputs: no named parameters. Returns: result
nexus_get_latest_addedARead-onlyIdempotent
Get the 10 most recently added mods for a game (array of mod info objects).
Inputs: domain_name (required). Returns: result
nexus_get_latest_updatedBRead-onlyIdempotent
Get the 10 most recently updated mods for a game (array of mod info objects).
Inputs: domain_name (required). Returns: result
nexus_get_legacy_modsARead-onlyIdempotent
Get mods by (gameId, modId) pairs via the legacy bridge (v2 GraphQL).
Returns: JSON {totalCount, _returned, nodes: [mod objects]}. Paginate with offset += _returned.
Inputs: ids (required), count, offset. Returns: result
nexus_get_modARead-onlyIdempotent
Get full details for one mod: name, author, version, description, endorsement and download counts, upload dates.
Returns: JSON mod info object (mod_id, name, summary, description BBCode, version, author, endorsement_count, mod_downloads, created/updated timestamps, ...). Server-cached 5 minutes.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_get_mod_changelogsARead-onlyIdempotent
Get the changelog history for one mod.
Returns: JSON dict mapping version -> list of HTML changelog strings, e.g. {"1.1": ["Fixed X"], "1.2": ["Added Y"]}.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_get_mod_endorsersARead-onlyIdempotent
List users who endorsed a mod via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Resolves the mod's uid first (two-step, both cached).
Returns: JSON {pageInfo: {endCursor, hasNextPage}, nodes: [{memberId, name, avatar, modCount, kudos, ...}]}. Paginate with after_cursor.
Inputs: mod_id (required), domain_name (required), first, after_cursor. Returns: result
nexus_get_mod_filesARead-onlyIdempotent
List all files attached to a mod, with versions, sizes, upload dates, and update chain.
Returns: JSON {files: [...], file_updates: [{old_file_id, new_file_id, ...}]}. File category_id mapping: 1=MAIN, 2=UPDATE, 3=OPTIONAL, 4=OLD_VERSION, 6=DELETED, 7=ARCHIVED.
Inputs: mod_id (required), domain_name (required), category. Returns: result
nexus_get_mods_batchARead-onlyIdempotent
Fetch many mods across games in a single v2 GraphQL query.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Batch equivalent of nexus_get_mod - ideal for resolving many mod IDs at once without burning quota.
Returns: JSON {totalResolved, _returned, mods: [...same shape as nexus_search_mods nodes...]}.
Inputs: mods (required), count, offset. Returns: result
nexus_get_mod_v2ARead-onlyIdempotent
Get rich mod details via v2 GraphQL: full description (raw BBCode), tags, requirements, and complete file list - none of which v1 REST exposes.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota.
Returns: JSON {mod: {..., description (BBCode + literal tags - render or strip before display), requirements}, files: [{fileId, name, version, category, sizeInBytes, totalDownloads, date, description}]}.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_get_newsARead-onlyIdempotent
Get Nexus Mods news articles (site news, game news, interviews, ...).
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Filter by category and/or game.
Returns: JSON {totalCount, _returned, nodes: [{id, title, summary, author, date, newsCategory, sourceName, sourceUrl, commentsCount, image, games}]}.
Inputs: count, offset, category, domain_name. Returns: result
nexus_get_opted_in_modsARead-onlyIdempotent
List a user's mods that opted into Donation Points (v2 GraphQL).
Returns: JSON {count, userId, user, entries: [{id, gameId, modId, uploaderId, ratio, createdAt}]}.
Inputs: account_id (required). Returns: result
nexus_get_preferencesARead-onlyIdempotent
Get the current user's site preferences (v2 GraphQL).
Returns: JSON with adult, default tabs/sort/search, download location, reminders, notification and subfeed booleans. Edit with nexus_update_preferences.
Inputs: no named parameters. Returns: result
nexus_get_private_message_urlARead-onlyIdempotent
Get the web URL for one of your private messages (v2 GraphQL).
Returns: JSON string URL or an error string.
Inputs: message_id (required). Returns: result
nexus_get_speedtest_urlsARead-onlyIdempotent
Get CDN speedtest URLs to diagnose download issues via v2 GraphQL.
Handy when downloads feel slow: test latency/throughput against each mirror and compare. Consumes the v2 GraphQL pool.
Returns: JSON array of {title, description, location, tag}.
Inputs: no named parameters. Returns: result
nexus_get_tag_by_idARead-onlyIdempotent
Get a single tag by ID (v2 GraphQL).
Returns: JSON {id, name, adult, global, taggablesCount, category, games}.
Inputs: tag_id (required). Returns: result
nexus_get_tag_categoriesARead-onlyIdempotent
List all tag categories with their tags (v2 GraphQL).
Returns: JSON list of {id, name, tags: [{id, name, adult}]}.
Inputs: no named parameters. Returns: result
nexus_get_tag_category_by_idARead-onlyIdempotent
Get a single tag category by ID (v2 GraphQL).
Returns: JSON {id, name, tags: [{id, name, adult}]}.
Inputs: category_id (required). Returns: result
nexus_get_tagsARead-onlyIdempotent
Get the mod tag taxonomy of a game via v2 GraphQL.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Useful to build tag filters for nexus_search_mods.
Returns: JSON list [{id, name, parentId, global, blockable, searchable}].
Inputs: domain_name (required), only_adult, exclude_adult. Returns: result
nexus_get_tags_v2BRead-onlyIdempotent
List tags with optional filters (v2 GraphQL).
Returns: JSON list of {id, name, adult, global, taggablesCount, category, games}.
Inputs: game_id, category_id, include_global, include_discarded. Returns: result
nexus_get_tracked_modsARead-onlyIdempotent
List the mods the authenticated account is tracking.
Returns: JSON array of {mod_id, domain_name}.
Inputs: no named parameters. Returns: result
nexus_get_transactionsARead-onlyIdempotent
Get Donation Points transactions for the current user (v2 GraphQL).
NOTE: Nexus hides the data under apikey-only auth ("hidden due to permissions"). Requires OAuth login (nexus_oauth_login + nexus_oauth_exchange); the tool surfaces the error otherwise.
Returns: JSON {totalCount, filteredCount, transactions: [{id, type, label, amount, createdAt, creditorEntity, debitorEntity}]}.
Inputs: start, search, bank_id, per_page, +3 more. Returns: result
nexus_get_trendingARead-onlyIdempotent
Get the 10 currently trending mods for a game (array of mod info objects).
Inputs: domain_name (required). Returns: result
nexus_get_updated_modsARead-onlyIdempotent
Get all mods for a game whose files/activity changed within a time window.
Returns: JSON array of {mod_id, latest_file_update (epoch), latest_mod_activity (epoch)}. Server-cached 5 minutes. Useful to check if your own mod page saw activity.
Inputs: period (required), domain_name (required). Returns: result
nexus_get_uploadsARead-onlyIdempotent
List mod file uploads with scan status (v2 GraphQL).
Returns: JSON {totalCount, filteredCount, uploads: [{id, status, uploadType, md5, sha256, virusTotalStatus, ...}]}.
Inputs: start, filter, mod_id, search, +8 more. Returns: result
nexus_get_user_by_nameARead-onlyIdempotent
Get a user profile by exact username via v2 GraphQL.
Unlike nexus_search_users (fuzzy), this resolves one exact username and fails cleanly when nobody has it. Useful to convert a username to a memberId for the user mutation tools.
Returns: JSON user object {memberId, name, avatar, modCount, kudos, joined, ...} or {userByName: null} when the username does not exist.
Inputs: username (required). Returns: result
nexus_get_user_donation_preferencesARead-onlyIdempotent
Get the current user's Donation Points donation preferences (v2 GraphQL).
Returns: JSON {donateStraight, donateProfile, donateAuthorpremium, donateOwnpremium, donatePremiumMax, paypal}. Edit with nexus_update_user_donation_preferences.
Inputs: no named parameters. Returns: result
nexus_get_user_monthly_reportARead-onlyIdempotent
Get the download/upload numbers for ONE specific month via v2 GraphQL.
Companion to nexus_get_user_monthly_summary (which lists available months): this fetches the actual per-mod/per-game values for a chosen month. Useful for tracking your own mod's download history. NOTE: Nexus hides this report for privacy-restricted accounts ("UserMonthlyReport was hidden due to permissions") - that is an API-side restriction, not a tool failure.
Returns: JSON {userMonthlyReport: {userId, reportType, entries: [{month, year, value, status, ratio, modId, gameId, authorId, ...}]}}.
Inputs: year (required), month (required), account_id (required). Returns: result
nexus_get_user_monthly_report_by_idARead-onlyIdempotent
Get one monthly Donation Points report by report ID (v2 GraphQL).
NOTE: Nexus hides this report for privacy-restricted accounts ("hidden due to permissions") - an API-side restriction, not a tool failure.
Returns: JSON {userId, entries: [{reportId, year, month, value, status, ratio, authorId, authorValue, gameId, modId, modCount, modValue, authorCount}]}.
Inputs: report_id (required), account_id (required). Returns: result
nexus_get_user_monthly_summaryARead-onlyIdempotent
List the months a user has a monthly activity report for.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Follow up with nexus_get_user_monthly_report (v1) for a specific month's download/upload numbers.
Returns: JSON {userId, entries: [{month, year}]}.
Inputs: account_id (required). Returns: result
nexus_get_user_v2ARead-onlyIdempotent
Get a public Nexus Mods user profile by member ID or exact username.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Provide exactly one of member_id or username.
Returns: JSON {memberId, name, about, avatar, modCount, joined, kudos, contributedModCount, collectionCount, recognizedAuthor, lastActive, posts}.
Inputs: username, member_id. Returns: result
nexus_give_kudosAIdempotent
Give kudos to a user via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {giveKudos: {success}} or an error string.
Inputs: user_id (required). Returns: result
nexus_graphql_introspectARead-onlyIdempotent
Introspect any type in the Nexus v2 GraphQL schema.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Useful for discovering filters, sorts, and fields before composing a query with nexus_graphql_query.
Returns: JSON {name, kind, description, fields: [{name, type}], inputFields, enumValues} or null if the type does not exist.
Inputs: type_name (required). Returns: result
nexus_graphql_queryA
Run a raw query against the Nexus v2 GraphQL API (power-user escape hatch).
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Introspect types with nexus_graphql_introspect first to build valid queries. Use for read-only queries; most mutations require OAuth scopes this server does not have and will fail cleanly.
Returns: The raw GraphQL 'data' payload as JSON, or 'Error: ...' with the server-side GraphQL error messages.
Inputs: query (required), variables. Returns: result
nexus_hide_commentADestructive
Hide a comment (moderator permissions required) via v2 GraphQL.
Returns: JSON {comment: {id}} or an error string.
Inputs: reason (required), comment_id (required), internal_reason. Returns: result
nexus_ignore_userAIdempotent
Ignore (mute) a user via v2 GraphQL - hides their content in your feed.
Personal preference only: no public side effect. Reversible with nexus_unignore_user. Provide user_id OR username (at least one). NOTE: applies immediately but list reads (nexus_get_ignored_users) can lag several seconds - wait before re-reading to confirm.
Returns: JSON {ignoreUser: {success}} or an error string.
Inputs: user_id, username. Returns: result
nexus_like_commentAIdempotent
Like a comment via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {likeComment: {comment}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_list_collectionAIdempotent
List (publish) a currently unlisted collection (must own it) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: collection_id (required). Returns: result
nexus_lock_commentAIdempotent
Lock a comment against further interaction (moderator permissions) via v2 GraphQL.
Returns: JSON {comment: {id}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_lock_comment_threadAIdempotent
Lock a comment thread (e.g. a mod's comments page) via v2 GraphQL.
Requires moderator permissions or thread ownership.
Returns: JSON {commentThread: {id, lockedAt}} or an error string.
Inputs: comment_thread_id (required). Returns: result
nexus_oauth_exchangeA
Complete the OAuth2 flow: exchange the authorization code for tokens.
Exchanges via PKCE code_verifier (+ client_secret when configured), saves tokens to the token file, and validates the identity with the resulting Bearer token. Tokens auto-refresh; any 4xx refresh response is treated as revocation per the official guide.
Returns: JSON account summary from nexus_validate_key, or an error string.
Inputs: code (required), state. Returns: result
nexus_oauth_loginA
Start the OAuth2 authorization-code flow: returns the URL to open in a browser.
Uses PKCE S256 + random state (per the official Nexus OAuth guide). After approving, copy the 'code' query parameter from the final redirect URL and pass it to nexus_oauth_exchange. Bearer tokens then take precedence over NEXUS_API_KEY and unlock user-context mutations.
Returns: JSON {authorize_url, redirect_uri, state, instructions}.
Inputs: scope, redirect_uri. Returns: result
nexus_oauth_logoutAIdempotent
Delete stored OAuth tokens and fall back to NEXUS_API_KEY authentication.
Removes the local token file. To fully revoke access, also remove the application at https://users.nexusmods.com/oauth/authorized_applications.
Returns: JSON {logged_out: true}.
Inputs: no named parameters. Returns: result
nexus_oauth_refreshAIdempotent
Force a refresh of the OAuth access token via the refresh grant.
Use when a request unexpectedly returns 401. A 4xx refresh failure means the user revoked the application (see https://users.nexusmods.com/oauth/authorized_applications) and the stored tokens are cleared - log in again with nexus_oauth_login.
Returns: JSON {refreshed, expires_at, scope} or an error string.
Inputs: no named parameters. Returns: result
nexus_oauth_statusARead-onlyIdempotent
Report the OAuth login state: configured env vars, token expiry, scope.
Never exposes the access token itself - only a prefix and expiry metadata.
Returns: JSON {configured, logged_in, expires_at, scope, has_refresh_token, token_file}.
Inputs: no named parameters. Returns: result
nexus_pin_commentAIdempotent
Pin a comment to the top of its thread via v2 GraphQL.
Requires moderator permissions or thread ownership.
Returns: JSON {comment: {id}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_publish_revisionADestructive
Publish a draft collection revision (must own the collection) via v2 GraphQL.
This makes the revision publicly available - hard to undo (use nexus_retract_revision afterwards).
Returns: JSON {success} or an error string.
Inputs: revision_id (required), collection_status, has_adult_resources. Returns: result
nexus_remove_badge_from_collectionAIdempotent
Remove a badge from a collection (moderator permissions required) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: badge_id (required), collection_id (required). Returns: result
nexus_remove_comment_likeAIdempotent
Remove your like from a comment via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {removeCommentLike: {comment}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_remove_favourite_gameAIdempotent
Remove a game from your favourites via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {removeFavouriteGame: {success}} or an error string.
Inputs: game_id (required). Returns: result
nexus_remove_kudosAIdempotent
Remove previously given kudos from a user via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {removeKudos: {success}} or an error string.
Inputs: user_id (required). Returns: result
nexus_reorder_itemAIdempotent
Reorder reorderable items (collection images/videos) via v2 GraphQL.
Requires ownership of the parent collection.
Returns: JSON {item: {__typename}} or an error string.
Inputs: id (required), location (required), target_id (required). Returns: result
nexus_reorder_pinned_commentsAIdempotent
Reorder pinned comments in a thread via v2 GraphQL.
Pass ALL pinned comment IDs of the thread in the desired order.
Returns: JSON {comments: [{id}]} in the new order, or an error string.
Inputs: comment_ids (required). Returns: result
nexus_request_media_upload_urlARead-onlyIdempotent
Request a presigned URL for uploading media (v2 GraphQL).
Returns: JSON {url, uuid}. Upload the file to url, then reference the uuid.
Inputs: filename, mime_type. Returns: result
nexus_resolve_domainARead-onlyIdempotent
Resolve a game display name to its domain_name slug (v2 GraphQL).
Convenience wrapper for agents: most tools require a lowercase
domain_name slug (e.g. 'skyrimspecialedition'), NOT the display name.
Call this first when you only know the game's name, then pass the returned
domainName value to the other tools.
Backed by the v2 GraphQL API (does not consume the v1 REST quota).
Returns:
JSON {totalCount, _returned, nodes: [{domainName, name, id}]} -
best matches first; take domainName from the intended node.
Inputs: game_name (required). Returns: result
nexus_restore_commentAIdempotent
Restore a previously discarded comment via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota. Undo for nexus_discard_comment — the comment becomes publicly visible again. REQUIRES OAuth Bearer auth: Nexus denies restore under apikey-only auth even for your own comments.
Returns: JSON {restoreComment: {comment: {id, isDiscarded, discardedAt}}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_retract_revisionBDestructive
Retract a published collection revision (must own it) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: reason (required), revision_id (required). Returns: result
nexus_search_by_md5ARead-onlyIdempotent
Look up which mod and file on Nexus matches a file's MD5 hash (useful to identify an installed file).
Returns: JSON array of {mod: , file_details: }.
Inputs: md5_hash (required), domain_name (required). Returns: result
nexus_search_collectionsARead-onlyIdempotent
Search Nexus Mods collections (curated mod packs) with free text.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. v1 REST has no collections search at all.
Returns: JSON {totalCount, _returned, nodes: [{slug, name, summary, endorsements, totalDownloads, overallRating, game, user, ...}]}.
Inputs: sort, term, count, offset, +2 more. Returns: result
nexus_search_commentsARead-onlyIdempotent
Search Nexus Mods comments by text or list a thread's comments.
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Provide exactly one of term or thread_id. KNOWN ISSUE: Nexus' searchComments endpoint currently returns HTTP 500 for all requests server-side; errors are surfaced as-is until Nexus fixes it. May also require extra permissions for some threads.
Returns: JSON {totalCount, timeTaken, nodes: [{id, body, createdAt, likesCount, isPinned, creator}]}.
Inputs: term, count, thread_id. Returns: result
nexus_search_gamesARead-onlyIdempotent
Search Nexus Mods games by name, sorted and paginated (v2 GraphQL).
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Complements nexus_get_games (full cached catalog).
Returns: JSON {totalCount, _returned, nodes: [{domainName, name, id, modCount, downloadCount, genre, forumUrl, supportsVortex, approvedAt}]}.
Inputs: sort, term, count, offset, +1 more. Returns: result
nexus_search_mediaARead-onlyIdempotent
Search site-wide media (images, supporter images, videos) via v2 GraphQL.
NOTE: this endpoint is SERVER-SIDE FLAKY - it intermittently fails with GraphQL "A name ... was not found" errors regardless of filter combination. Identical calls often succeed on retry; just retry. (An adultContent filter was deliberately removed: that filter consistently errors server-side for both True and False.)
Returns: JSON {totalCount, _returned, nodes: [...]}. Nodes are a union (Image, SupporterImage, Video) discriminated by __typename. Paginate with offset += _returned.
Inputs: sort, count, owner, offset, +6 more. Returns: result
nexus_search_modsARead-onlyIdempotent
Search Nexus Mods with free text + filters, sorted and paginated.
Backed by the v2 GraphQL API (https://api.nexusmods.com/v2/graphql), which does NOT consume the v1 REST rate-limit quota. The v1 REST API has no free-text search, so this is the only way to search by name.
Returns: JSON {totalCount, _returned, nodes: [{modId, uid, name, summary, author, version, downloads, endorsements, fileSize, game, modCategory, uploader, pictureUrl, ...}]}. Paginate with offset += _returned until offset >= totalCount. Note: description (full BBCode) is NOT included here - use nexus_get_mod_v2 for full mod details.
Inputs: sort, term, count, offset, +5 more. Returns: result
nexus_search_usersARead-onlyIdempotent
Search Nexus Mods users by username (v2 GraphQL).
Backed by the v2 GraphQL API, which does NOT consume the v1 REST rate-limit quota. Unlike nexus_get_user_v2 this supports partial names.
Returns: JSON {totalCount, _returned, nodes: [{memberId, name, avatar, modCount, joined, kudos, ...}]}. Paginate with offset += _returned.
Inputs: term (required), mode, sort, count, +2 more. Returns: result
nexus_start_age_verification_appeal_flowA
Start the age verification appeal flow for the current user (v2 GraphQL).
This is an ACTION, not a read: it initiates an appeal session.
Returns: JSON {success, message, verificationResult: {id, url}} - open url to continue.
Inputs: no named parameters. Returns: result
nexus_start_age_verification_flowA
Start the age verification flow for the current user (v2 GraphQL).
This is an ACTION, not a read: it initiates a verification session.
Returns: JSON {success, message, verificationResult: {id, url}} - open url to verify.
Inputs: no named parameters. Returns: result
nexus_submit_moderation_fixA
Submit a fix for an active moderation on your content (v2 GraphQL).
Returns: JSON {success, moderationFix: {id, status, description, createdAt}}.
Inputs: moderation_id (required), description. Returns: result
nexus_track_app_metricA
Report an app metric (e.g. a Vortex collection install event) via v2 GraphQL.
Returns: JSON {success, errors} or an error string.
Inputs: entity_id (required), event_type (required), entity_type (required), client_string, +1 more. Returns: result
nexus_track_modAIdempotent
Start tracking a mod for the authenticated account (get update notifications).
Returns: JSON {message: "..."}; HTTP 200 = already tracking, 201 = newly tracked.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_track_userAIdempotent
Start tracking a user (get notifications about their new mods) via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {trackUser: {success}} or an error string.
Inputs: user_id (required). Returns: result
nexus_unblock_mods_from_earning_dpAIdempotent
Unblock a user's mods from earning Donation Points via v2 GraphQL.
Requires moderator permissions when targeting another user.
Returns: JSON {success} or an error string.
Inputs: user_id. Returns: result
nexus_unblock_tagAIdempotent
Unblock a previously blocked tag via v2 GraphQL.
Personal preference only: no public side effect. List reads (nexus_get_blocked_tags) can lag several seconds after this returns success - wait before re-reading to confirm.
Returns: JSON {unblockTag: {success}} or an error string.
Inputs: tag_id (required). Returns: result
nexus_unignore_userAIdempotent
Stop ignoring (unmute) a user via v2 GraphQL.
Personal preference only: no public side effect. Provide user_id OR username (at least one). NOTE: applies immediately but list reads (nexus_get_ignored_users) can lag several seconds - wait before re-reading to confirm.
Returns: JSON {unignoreUser: {success}} or an error string.
Inputs: user_id, username. Returns: result
nexus_unlist_collectionAIdempotent
Unlist a collection (hide from public listings, keep URL) via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: collection_id (required). Returns: result
nexus_unpin_commentAIdempotent
Unpin a previously pinned comment via v2 GraphQL.
Requires moderator permissions or thread ownership.
Returns: JSON {comment: {id}} or an error string.
Inputs: comment_id (required). Returns: result
nexus_untrack_modBDestructiveIdempotent
Stop tracking a mod for the authenticated account.
Returns: JSON {message: "..."}.
Inputs: mod_id (required), domain_name (required). Returns: result
nexus_untrack_userADestructiveIdempotent
Stop tracking a user via v2 GraphQL.
Consumes the v2 GraphQL pool, NOT the v1 REST rate-limit quota.
Returns: JSON {untrackUser: {success}} or an error string.
Inputs: user_id (required). Returns: result
nexus_update_about_meAIdempotent
Update a user's About Me profile text via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: about (required), user_id. Returns: result
nexus_update_changelogAIdempotent
Update an existing changelog entry (must own it) via v2 GraphQL.
Returns: JSON {success, changelogId} or an error string.
Inputs: description (required), changelog_id (required). Returns: result
nexus_update_countryAIdempotent
Update a user's country via v2 GraphQL.
Returns: JSON {success} or an error string.
Inputs: country, user_id. Returns: result
nexus_update_mod_direct_downloadAIdempotent
Enable or disable direct (no-ads) downloads on your own mod via v2 GraphQL.
REQUIRES OAuth login (nexus_oauth_login + nexus_oauth_exchange): this user-context mutation is rejected under apikey-only auth even for the mod owner. Useful for mod authors automating release pipelines.
Returns: JSON payload from Nexus or an error string.
Inputs: enabled (required), mod_uid (required). Returns: result
nexus_update_preferencesAIdempotent
Update the current user's site preferences via v2 GraphQL.
Only the provided fields are changed; omitted fields stay as-is. Read current values with nexus_get_preferences.
Returns: JSON {success} or an error string.
Inputs: adult, results, comments, download, +22 more. Returns: result
nexus_update_revisionAIdempotent
Update a collection revision's metadata (must own it) via v2 GraphQL.
Only the provided fields are changed; omitted fields stay as-is.
Returns: JSON {success, revisionId} or an error string.
Inputs: revision_id (required), adult_content, installation_info. Returns: result
nexus_update_tagAIdempotent
Update an existing tag (moderator permissions may be required) via v2 GraphQL.
Only the provided fields are changed; omitted fields stay as-is.
Returns: JSON {success, tag: {id, name}} or an error string.
Inputs: tag_id (required), name, adult, game_ids, +2 more. Returns: result
nexus_update_user_donation_preferencesAIdempotent
Update the current user's Donation Points preferences via v2 GraphQL.
Only the provided fields are changed; omitted fields stay as-is.
Returns: JSON {success, userDonationPreferences: {...}} or an error string.
Inputs: paypal, dp_opted_in, donate_profile, donate_straight, +3 more. Returns: result
nexus_upload_attachmentA
Upload an attachment (usable in comments) via the v2 GraphQL multipart spec.
Accepts base64-encoded content and posts it as an Apollo Upload multipart request. Attachments can then be referenced by id in comment mutations.
Returns: JSON {attachment: {id, filename, url}} or an error string.
Inputs: filename (required), content_base64 (required), mime_type. Returns: result
nexus_validate_keyARead-onlyIdempotent
Validate the configured Nexus Mods API key and identify the account.
Returns user_id, username, is_premium, is_supporter, email, and profile_url. This endpoint is exempt from hourly rate limits - safe to use to check the key works or to probe remaining quota via the '_rl' rate-limit snapshot.
Inputs: no named parameters. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 135 tools
Several clusters of tools have nearly identical purposes: mod file listings (nexus_get_mod_files, nexus_get_files_v2, nexus_get_files_by_uid), MD5 lookups (nexus_search_by_md5, nexus_get_file_hash, nexus_get_file_hashes), and exact user lookups (nexus_get_user_v2, nexus_get_user_by_name). The descriptions are thorough and often point out differences, but agents must read carefully to avoid mis-selecting, and v1/v2 duplicates create genuine boundary ambiguity.
Almost every tool follows a nexus_verb_noun snake_case pattern, and subdomain prefixes like oauth_ and graphql_ are internally consistent. Minor deviations from strict verb-first structure and inconsistently applied _v2 suffixes prevent a perfect score.
135 tools is an extreme count by any MCP standard, far above the 50+ threshold for a mismatch. Even for a broad platform API, this creates severe navigation and selection burden and would be better split into focused servers or consolidated tool groups.
The surface covers lifecycle operations for mods, files, collections, revisions, comments, tags, users, preferences, OAuth, moderation, and more, plus a raw GraphQL introspect/query escape hatch. There are no obvious dead ends for the domain this server targets.
Maintenance
Related MCP Connectors
Discover MCP servers and A2A agents; verify, message, post, follow, react, and receive webhooks.
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
Managed MCP gateway with OAuth, per-agent permissions, shared accounts and activity logs.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local MCP server for Nexus Mods mod discovery and research, backed by the v2 GraphQL API, enabling search of games, mods, collections, and users.106 npm1ISC
- AlicenseNot gradedqualityDmaintenanceA local MCP server for Nexus Mods mod discovery, research, and downloading, backed by the v2 GraphQL API and the website's DownloadPopUp widget.106 npm2MIT
- FlicenseAqualityBmaintenanceExposes the Nexus Mods API to AI agents so they can search and inspect mods, browse authors' catalogues, and upload or publish mod files from a local archive in a few aggregated tool calls. It handles authentication, caching, reporting quotas, and the multi-step v3 upload flow, while gating write and publish operations behind opt-in permissions.22-
- AlicenseBqualityBmaintenanceEnables interacting with Nexus Mods: search and download mods, manage endorsements and uploads, and use a browser session for comments, forums, and private messages.2257Creative Commons Attribution Non Commercial 4.0 International