Skip to main content
Glama

nexus-mcp

License: MIT Python 3.10+ CI PyPI 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_file streams 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 _rl snapshot 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-mcp

Or from a cloned repository:

pip install -r requirements.txt
python -m nexus_mcp

Works 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

NEXUS_API_KEY

yes

Personal API key from Nexus Mods

NEXUS_OAUTH_CLIENT_ID

no

OAuth client ID (see below)

NEXUS_OAUTH_CLIENT_SECRET

no

Only for non-public OAuth apps

NEXUS_OAUTH_REDIRECT_URI

no

Defaults to http://localhost/callback

NEXUS_OAUTH_TOKEN_FILE

no

Token store path, defaults to ~/.nexus-mcp/oauth-tokens.json

NEXUS_MCP_TOOLS

no

Tool profile: all (default), read (74 read-only tools only), or rw (all but the 12 destructive tools)

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:

  1. nexus_oauth_login → returns an authorize_url (state + PKCE challenge); open it, log in, and copy the code from the redirect URL.

  2. nexus_oauth_exchange(code) → exchanges the code for tokens, persists them to NEXUS_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 _rl snapshot (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

nexus_validate_key

Check API key + account info (exempt from rate limits)

nexus_get_games / nexus_get_game

Game catalog (substring filter) / one game + categories

nexus_get_mod / nexus_get_mod_changelogs

Mod details (endorsements, downloads, description) / changelog per version

nexus_get_latest_added / nexus_get_latest_updated / nexus_get_trending

10 newest / updated / trending mods for a game

nexus_get_updated_mods

Mods with activity in the last 1d/1w/1m

nexus_get_mod_files / nexus_get_file_info

Mod file list (category filter) / one file's details (MD5, size, version)

nexus_get_download_link

Short-lived CDN download URL (non-premium needs key+expires from a .nxm link)

nexus_download_mod_file

Stream a file to disk (MD5+SHA-256 verification, max_bytes cap)

nexus_search_by_md5

Identify a mod/file from an MD5 hash

nexus_get_tracked_mods / nexus_track_mod / nexus_untrack_mod

Manage tracked mods

nexus_get_endorsements / nexus_endorse_mod / nexus_abstain_endorsement

Manage endorsements

v2 GraphQL (does not consume v1 quota)

Tool

Description

nexus_search_mods

Free-text mod search (wildcard) + game/endorsement/download filters + sort + pagination

nexus_get_mod_v2

Full mod details: raw BBCode description, tags, requirements, complete file list

nexus_get_mods_batch

Resolve many mods in one query: "domain:modId,domain:modId"

nexus_get_mod_endorsers

Users who endorsed a mod (cursor pagination)

nexus_search_games / nexus_get_game_v2

Game search / rich game details (genre, forum, counts, Vortex support)

nexus_resolve_domain

Resolve a game display name (e.g. 'Skyrim Special Edition') to its domain_name slug — call before any tool needing domain_name

nexus_get_files_v2 / nexus_get_files_by_uid

File lists via v2 (by domain/modId or by uid)

nexus_search_users / nexus_get_user_v2 / nexus_get_user_by_name

User search (fuzzy) / public profile by id or username / exact username lookup

nexus_search_collections / nexus_get_collection / nexus_get_collection_revision

Collection search / details by slug / single revision

nexus_get_categories / nexus_get_category_by_id / nexus_get_collection_games

Collection categories (per-game or global)

nexus_get_tags / nexus_get_tags_v2 / nexus_get_tag_by_id / nexus_get_tag_categories / nexus_get_tag_category_by_id

Tag taxonomy

nexus_get_comment_thread / nexus_get_comment / nexus_search_comments

Comment reads (⚠️ search_comments is 500-ing server-side at Nexus; use get_comment_thread instead)

nexus_get_badges

Static catalog of earnable mod badges

nexus_get_news

Site/game news, interviews, features (filter by category/game)

nexus_graphql_query / nexus_graphql_introspect

Raw GraphQL escape hatch / schema introspection

nexus_get_age_verification_info / nexus_get_api_applications / nexus_get_current_warnings

Account state reads

nexus_get_external_video / nexus_get_game_artwork / nexus_get_legacy_mods / nexus_get_file_hash(es)

Media + legacy lookups

nexus_search_media

Site-wide media search (⚠️ Nexus endpoint is intermittently flaky — retry)

nexus_get_preferences / nexus_update_preferences

Site preferences (emails, default tabs, download location...)

nexus_get_user_donation_preferences / nexus_update_user_donation_preferences

Donation Points preferences

nexus_get_favourite_games / nexus_add_favourite_game / nexus_remove_favourite_game

Favourite games

nexus_get_ignored_users / nexus_ignore_user / nexus_unignore_user

Ignored users

nexus_get_blocked_tags / nexus_block_tag / nexus_unblock_tag

Blocked tags

nexus_track_user / nexus_untrack_user

Track/untrack users for update notifications

nexus_give_kudos / nexus_remove_kudos

Kudos

nexus_like_comment / nexus_remove_comment_like

Comment likes

nexus_create_comment / nexus_edit_comment / nexus_discard_comment / nexus_restore_comment

Comment mutations (nested replies via reply_to_id)

nexus_create_message / nexus_upload_attachment

Private messages (multipart attachments)

nexus_update_about_me / nexus_update_country

Profile updates

nexus_get_speedtest_urls

CDN speedtest endpoints

nexus_get_opted_in_mods / nexus_get_transactions / nexus_get_user_monthly_summary / nexus_get_user_monthly_report / nexus_get_user_monthly_report_by_id

Donation Points reporting (⚠️ some data is hidden under API-key auth — OAuth required)

nexus_get_uploads

Upload activity with scan status

Collections, moderation & misc mutations

Tool

Description

nexus_create_collection / nexus_edit_collection

Create/edit collections (manifest, BBCode description)

nexus_create_or_update_revision / nexus_update_revision / nexus_publish_revision / nexus_retract_revision / nexus_discard_revision

Revision lifecycle

nexus_list_collection / nexus_unlist_collection / nexus_discard_collection

Collection visibility lifecycle

nexus_create_changelog / nexus_update_changelog

Revision changelogs

nexus_create_tag / nexus_update_tag / nexus_discard_tag

Tag management (moderator)

nexus_add_badge_to_collection / nexus_remove_badge_from_collection / nexus_reorder_item

Collection content management

nexus_close_collection_bug_report

Close bug reports on your collections

nexus_submit_moderation_fix

Submit fixes for moderated content

nexus_hide_comment / nexus_lock_comment / nexus_lock_comment_thread / nexus_pin_comment / nexus_unpin_comment / nexus_reorder_pinned_comments / nexus_clear_comment_moderation_status / nexus_clear_comment_thread_moderation_status

Comment moderation (moderator/owner)

nexus_block_mods_from_earning_dp / nexus_unblock_mods_from_earning_dp

Donation Points earning control (moderator)

nexus_track_app_metric

App metrics (e.g. Vortex collection installs)

nexus_update_mod_direct_download

Toggle direct downloads on your own mods (OAuth required)

nexus_start_age_verification_flow / nexus_start_age_verification_appeal_flow

Age verification flows

nexus_request_media_upload_url / nexus_get_collection_revision_upload_url

Presigned upload URLs

nexus_oauth_login / nexus_oauth_exchange / nexus_oauth_status / nexus_oauth_refresh / nexus_oauth_logout

OAuth2 flow (PKCE S256, auto-refresh, apikey fallback)

API quirks worth knowing

  • domain_name is 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/expires pair extracted from a .nxm link 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_comment is 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_comments currently returns HTTP 500 from Nexus itself, regardless of parameters; nexus_get_comment_thread is 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 stdio

CI 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

MIT

Available Tools

135 tools
nexus_abstain_endorsementA
Destructive

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_collectionA
Idempotent

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_gameA
Idempotent

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_dpA
Destructive

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_tagA
Idempotent

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_statusB
Idempotent

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_statusA
Idempotent

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_reportA
DestructiveIdempotent

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_revisionA
Idempotent

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_collectionA
Destructive

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_commentA
Destructive

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_revisionA
Destructive

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_tagA
Destructive

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_collectionA
Idempotent

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_commentA
Idempotent

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_infoA
Read-onlyIdempotent

Get a user's age verification status (v2 GraphQL).

Returns: JSON {verified, externalVerificationIds: [{createdAt, externalVerificationId}]}.

Inputs: user_id. Returns: result

nexus_get_api_applicationsA
Read-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_badgesA
Read-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_tagsA
Read-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_categoriesA
Read-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_idA
Read-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_collectionA
Read-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_gamesA
Read-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_revisionA
Read-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_urlA
Read-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_commentA
Read-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_threadA
Read-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_warningsA
Read-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_endorsementsA
Read-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_videoA
Read-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_gamesA
Read-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_hashB
Read-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_hashesA
Read-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_infoA
Read-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_uidA
Read-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_v2A
Read-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_gameA
Read-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_artworkA
Read-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_gamesA
Read-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_v2A
Read-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_usersA
Read-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_addedA
Read-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_updatedB
Read-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_modsA
Read-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_modA
Read-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_changelogsA
Read-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_endorsersA
Read-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_filesA
Read-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_batchA
Read-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_v2A
Read-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_newsA
Read-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_modsA
Read-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_preferencesA
Read-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_urlA
Read-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_urlsA
Read-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_idA
Read-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_categoriesA
Read-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_idA
Read-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_tagsA
Read-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_v2B
Read-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_modsA
Read-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_transactionsA
Read-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_updated_modsA
Read-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_uploadsA
Read-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_nameA
Read-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_preferencesA
Read-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_reportA
Read-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_idA
Read-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_summaryA
Read-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_v2A
Read-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_kudosA
Idempotent

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_introspectA
Read-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_commentA
Destructive

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_userA
Idempotent

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_commentA
Idempotent

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_collectionA
Idempotent

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_commentA
Idempotent

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_threadA
Idempotent

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_logoutA
Idempotent

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_refreshA
Idempotent

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_statusA
Read-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_commentA
Idempotent

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_revisionA
Destructive

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_collectionA
Idempotent

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_likeA
Idempotent

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_gameA
Idempotent

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_kudosA
Idempotent

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_itemA
Idempotent

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_commentsA
Idempotent

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_urlA
Read-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_domainA
Read-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_commentA
Idempotent

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_revisionB
Destructive

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_md5A
Read-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_collectionsA
Read-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_commentsA
Read-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_gamesA
Read-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_mediaA
Read-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_modsA
Read-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_usersA
Read-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_modA
Idempotent

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_userA
Idempotent

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_dpA
Idempotent

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_tagA
Idempotent

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_userA
Idempotent

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_collectionA
Idempotent

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_commentA
Idempotent

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_modB
DestructiveIdempotent

Stop tracking a mod for the authenticated account.

Returns: JSON {message: "..."}.

Inputs: mod_id (required), domain_name (required). Returns: result

nexus_untrack_userA
DestructiveIdempotent

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_meA
Idempotent

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_changelogA
Idempotent

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_countryA
Idempotent

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_downloadA
Idempotent

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_preferencesA
Idempotent

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_revisionA
Idempotent

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_tagA
Idempotent

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_preferencesA
Idempotent

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_keyA
Read-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

    A3.6/5.0

    Scored across 135 tools

    Disambiguation2/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness5/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      A 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 npm
      1
      ISC
    • A
      license
      Not graded
      quality
      D
      maintenance
      A local MCP server for Nexus Mods mod discovery, research, and downloading, backed by the v2 GraphQL API and the website's DownloadPopUp widget.
      106 npm
      2
      MIT
    • F
      license
      A
      quality
      B
      maintenance
      Exposes 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
      -
    • A
      license
      B
      quality
      B
      maintenance
      Enables interacting with Nexus Mods: search and download mods, manage endorsements and uploads, and use a browser session for comments, forums, and private messages.
      22
      57
      Creative Commons Attribution Non Commercial 4.0 International