Ruddur MCP Server
Ruddur MCP Server exposes scoped tools for authenticated creators to manage Ruddur content, media, marketplace offerings, analytics, and billing through MCP.
Headings: list, search, get, create/import, update, delete, clone, export, manage tags/status, snapshots, and templates.
Waypoints: list, create, update, delete, attach to Headings, manage placements, and manage waypoint notes.
Media: create presigned uploads, list/update/delete assets, attach/detach assets, and create transforms.
Marketplace: manage listings, creator profile, coupons, verify entitlements, and read license details.
Analytics, billing, and events: record creator events and read analytics/billing summaries.
Collaboration: list, add, update, and remove Heading collaborators.
Access controls: tools require scopes such as content.read/manage, media.read/manage, marketplace.*, analytics.read, billing.read, or events.write; destructive actions require confirm=true. Hosted use OAuth, while local stdio uses an API token env file.
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., "@Ruddur MCP Server create a heading named 'Project Kickoff'"
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.
Ruddur MCP Server
MCP server for the Ruddur creator API. The public marketplace uses the hosted Streamable HTTP endpoint and browser OAuth; a local stdio mode remains available for development.
Marketplace installation
The Codex and Claude plugin manifests connect to https://mcp.ruddur.com/mcp. Users do not create an environment file or paste an API token. On first use, the host discovers Ruddur's OAuth metadata, opens the Ruddur login/consent page, and stores the resulting scoped token.
The service operator must deploy the included Docker image and publish /mcp over HTTPS. See docs/PUBLIC_MCP_ARCHITECTURE.md.
Coaches can grant relationships.assign separately from relationships.read. With that write grant, ruddur_assign_heading takes the relationshipId from ruddur_list_coaching_clients and a creator-owned headingId from Heading search/list tools. The API derives the client from the active coaching relationship, copies the Heading and Waypoints through the same application workflow as the web UI, and returns the existing assignment on retry. Grant relationships.read as well to verify the assignment through the coaching roster and assigned-results tools. Existing read-only tokens cannot assign Headings; reconnect and approve the new grant to make the tool available.
ruddur_remove_heading_assignment uses that same assignment-write grant for a coach or other assigner to remove one of their assignments. It requires an active relationship, both IDs from the relationship roster, and confirm=true. Removal is idempotent and ends assignment-scoped result access. An untouched client copy is removed; a started copy and its saved work remain with the client.
Related MCP server: Discovery Engine MCP Server
Protocol compatibility
The HTTPS endpoint automatically supports both MCP eras:
MCP through
2025-11-25uses the initialization-based SDK transport expected by current Codex and Claude clients.MCP
2026-07-28uses stateless per-request metadata,server/discover, required request headers,resultType, and cache metadata.
The endpoint detects the era from MCP-Protocol-Version and params._meta. Both handlers use the same scoped tool runtime and forward the OAuth-issued creator API token to the existing Ruddur backend APIs.
Container publishing
GitLab CI runs typechecking, tests, and compilation before Kaniko builds a linux/amd64 image. Every branch or tag publishes:
$CI_REGISTRY_IMAGE/app:$CI_COMMIT_SHORT_SHAThe default branch also publishes :latest; Git tags additionally publish an image with the same tag. GitLab's built-in CI_JOB_TOKEN authenticates the registry push, matching the other Ruddur service repositories.
Setup
cd ruddur-mcp
npm install
cp .env.stdio.example .env
npm run buildSet at least:
RUDDUR_API_BASE=https://ruddur.com
RUDDUR_CREATOR_API_TOKEN=your-tokenRUDDUR_CREATOR_SCOPES is optional. When present, the server only advertises tools matching those scopes. When absent, it advertises all allowlisted creator tools and lets the Ruddur API enforce the token's actual scopes.
This token-based file is only for local stdio development. Hosted deployments use .env.example, which intentionally contains no creator token: each marketplace user's OAuth token arrives as the bearer credential on their MCP request.
Set RUDDUR_MCP_ALLOW_MUTATIONS=false to run read-only. Delete, restore, publish/status, and detach operations require confirm=true from the calling agent.
Local Codex development
For local stdio development, add this to ~/.codex/config.toml:
[mcp_servers.ruddur]
command = "npx"
args = ["-y", "git+https://gitlab.com/ruddur1/ruddur-mcp.git"]
env = { RUDDUR_MCP_ENV_FILE = "/absolute/path/to/your/.env" }The referenced .env must define RUDDUR_CREATOR_API_TOKEN. The server defaults RUDDUR_API_BASE to https://ruddur.com.
Alternatively, for a locally cloned checkout:
Add this to ~/.codex/config.toml:
[mcp_servers.ruddur]
command = "node"
args = ["/absolute/path/to/ruddur-mcp/dist/index.js"]
env = { RUDDUR_MCP_ENV_FILE = "/absolute/path/to/ruddur-mcp/.env" }Restart Codex after changing MCP configuration.
Local Claude Code development
For local stdio development:
claude mcp add-json ruddur '{
"type": "stdio",
"command": "npx",
"args": ["-y", "git+https://gitlab.com/ruddur1/ruddur-mcp.git"],
"env": {
"RUDDUR_MCP_ENV_FILE": "/absolute/path/to/your/.env"
}
}'Set RUDDUR_MCP_ALLOW_MUTATIONS=false for read-only use. Set RUDDUR_MCP_ALLOW_MUTATIONS=true when Claude should see create/update tools such as ruddur_create_heading and ruddur_create_waypoint.
Security
Use the narrowest creator-token scopes needed.
Keep
.envout of source control.The server never exposes a generic URL/path request tool.
Token management is excluded because Ruddur requires session authentication for issuing and revoking API tokens.
Only local stdio mode reads
.env; the public remote server uses OAuth and never receives a user's local environment.
Development
npm run typecheck
npm test
npm run buildAvailable Tools
53 toolsruddur_add_heading_collaboratorA
Add a collaborator to a Heading. The MCP server accepts collaborator aliases such as userId, collaboratorId, permission, access, and accessLevel. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_apply_heading_templateA
Create a Heading from a template. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_attach_media_assetA
Attach a media asset to Ruddur content. The MCP server accepts media aliases such as title/name, mimeType/contentType, size/fileSize, and heading/waypoint/listing identifiers. Requires scope: media.manage.
Inputs: pathParams (required), body, query.
ruddur_attach_waypointB
Attach a Waypoint to a Heading. The MCP server accepts placement aliases such as heading, index, state, and sortOrder. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_clone_headingA
Clone a creator-owned Heading. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_create_couponA
Create a marketplace coupon. The MCP server accepts coupon aliases such as promoCode, percentOff, amountOff, expires, usageLimit, and marketplaceListingId. Requires scope: marketplace.manage.
Inputs: body, query.
ruddur_create_headingA
Create or import a creator-owned Heading. Omit assessmentConfig for ordinary waypoints; include it only for explicit assessment-style waypoints. The MCP server maps creatorAssessmentConfig to assessmentConfig when provided. Requires scope: content.manage.
Inputs: body, query.
ruddur_create_heading_snapshotB
Create a named Heading snapshot. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_create_heading_templateA
Create a reusable template from a Heading. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_create_marketplace_listingA
Create a marketplace listing. The MCP server accepts natural marketplace payloads, including marketplace details, title/name aliases, comma-separated tags, lowercase status/currency, and top-level waypoints converted into a heading payload. Ordinary waypoints should not include assessmentConfig. Keep marketplace descriptions outcome-focused and buyer-facing. Do not add question-format, free-text, PII/data-handling, or generic educational/non-diagnostic boilerplate unless explicitly requested or specifically required; place necessary disclosures in a dedicated assessment introduction, help, or consent surface when available. Requires scope: marketplace.manage.
Inputs: body, query.
ruddur_create_media_transformB
Create or register a media transform. The MCP server accepts media aliases such as title/name, mimeType/contentType, size/fileSize, and heading/waypoint/listing identifiers. Requires scope: media.manage.
Inputs: pathParams (required), body, query.
ruddur_create_media_uploadA
Create a presigned creator-media upload. The MCP server accepts media aliases such as title/name, mimeType/contentType, size/fileSize, and heading/waypoint/listing identifiers. Requires scope: media.manage.
Inputs: body, query.
ruddur_create_waypointA
Create a creator-owned Waypoint. Omit assessmentConfig for ordinary waypoints; include it only for explicit assessment-style waypoints. The MCP server maps creatorAssessmentConfig to assessmentConfig when provided. Requires scope: content.manage.
Inputs: body, query.
ruddur_create_waypoint_noteA
Create a note on a Heading Waypoint. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_delete_headingADestructiveIdempotent
Delete a creator-owned Heading. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_delete_marketplace_listingADestructiveIdempotent
Delete a marketplace listing. Requires scope: marketplace.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_delete_media_assetADestructiveIdempotent
Delete a creator media asset. Requires scope: media.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_delete_waypointADestructiveIdempotent
Delete a creator-owned Waypoint. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_delete_waypoint_noteADestructiveIdempotent
Delete a Waypoint note. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_delete_waypoint_placementADestructiveIdempotent
Delete a Waypoint placement. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_detach_media_assetA
Detach a media asset from Ruddur content. The MCP server accepts media aliases such as title/name, mimeType/contentType, size/fileSize, and heading/waypoint/listing identifiers. Requires scope: media.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_export_headingARead-onlyIdempotent
Export a Heading as JSON. Requires scope: content.read.
Inputs: pathParams (required), body, query.
ruddur_get_creator_analyticsARead-onlyIdempotent
Get creator analytics summary. Requires scope: analytics.read.
Inputs: body, query.
ruddur_get_creator_billingBRead-onlyIdempotent
Get creator billing summary. Requires scope: billing.read.
Inputs: body, query.
ruddur_get_creator_profileARead-onlyIdempotent
Get the authenticated creator profile. Requires one of scope: marketplace.read, marketplace.manage.
Inputs: body, query.
ruddur_get_headingARead-onlyIdempotent
Get a creator-owned Heading by id. Requires scope: content.read.
Inputs: pathParams (required), body, query.
ruddur_get_marketplace_licenseBRead-onlyIdempotent
Get creator license details for a purchase. Requires one of scope: marketplace.entitlements, marketplace.manage.
Inputs: pathParams (required), body, query.
ruddur_import_headingsA
Import one or more Headings from JSON. Omit assessmentConfig for ordinary waypoints; include it only for explicit assessment-style waypoints. The MCP server maps creatorAssessmentConfig to assessmentConfig when provided. Requires scope: content.manage.
Inputs: body, query.
ruddur_list_couponsBRead-onlyIdempotent
List creator marketplace coupons. Requires one of scope: marketplace.read, marketplace.manage.
Inputs: body, query.
ruddur_list_heading_collaboratorsARead-onlyIdempotent
List collaborators on a Heading. Requires scope: content.read.
Inputs: pathParams (required), body, query.
ruddur_list_headingsARead-onlyIdempotent
List creator-owned Headings. Requires scope: content.read.
Inputs: body, query.
ruddur_list_heading_snapshotsARead-onlyIdempotent
List snapshots for a Heading. Requires scope: content.read.
Inputs: pathParams (required), body, query.
ruddur_list_heading_templatesARead-onlyIdempotent
List creator Heading templates. Requires scope: content.read.
Inputs: body, query.
ruddur_list_media_assetsARead-onlyIdempotent
List creator media assets. Requires scope: media.read.
Inputs: body, query.
ruddur_list_my_marketplace_listingsBRead-onlyIdempotent
List marketplace listings owned by the creator. Requires one of scope: marketplace.read, marketplace.manage.
Inputs: body, query.
ruddur_list_waypoint_notesARead-onlyIdempotent
List notes on a Heading Waypoint. Requires scope: content.read.
Inputs: pathParams (required), body, query.
ruddur_list_waypointsARead-onlyIdempotent
List creator-owned Waypoints. Requires scope: content.read.
Inputs: body, query.
ruddur_record_creator_eventA
Record a creator analytics event. The MCP server accepts event/type/name as aliases for eventType and timestamp/time/createdAt as aliases for occurredAt. Requires scope: events.write.
Inputs: idempotencyKey (required), body, query.
ruddur_remove_heading_collaboratorADestructiveIdempotent
Remove a Heading collaborator. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_restore_heading_snapshotA
Restore a Heading snapshot. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_search_headingsARead-onlyIdempotent
Search creator-owned Headings using query parameter q. Requires scope: content.read.
Inputs: body, query.
ruddur_update_couponA
Update a marketplace coupon. The MCP server accepts coupon aliases such as promoCode, percentOff, amountOff, expires, usageLimit, and marketplaceListingId. Requires scope: marketplace.manage.
Inputs: pathParams (required), body, query.
ruddur_update_creator_profileA
Create or update the authenticated creator profile. The MCP server accepts name, creatorName, or title as aliases for displayName. Requires scope: marketplace.manage.
Inputs: body, query.
ruddur_update_headingBIdempotent
Update a Heading, cover asset, or canvas style. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_update_heading_collaboratorAIdempotent
Update a Heading collaborator role. The MCP server accepts collaborator aliases such as userId, collaboratorId, permission, access, and accessLevel. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_update_heading_statusB
Update a Heading lifecycle status. Requires scope: content.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_update_heading_tagsAIdempotent
Replace the tags on a Heading. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_update_marketplace_listingAIdempotent
Update or publish a marketplace listing. The MCP server accepts natural marketplace payloads, including marketplace details, title/name aliases, comma-separated tags, lowercase status/currency, and top-level waypoints converted into a heading payload. Ordinary waypoints should not include assessmentConfig. Keep marketplace descriptions outcome-focused and buyer-facing. Do not add question-format, free-text, PII/data-handling, or generic educational/non-diagnostic boilerplate unless explicitly requested or specifically required; place necessary disclosures in a dedicated assessment introduction, help, or consent surface when available. Requires scope: marketplace.manage.
Inputs: confirm (required), pathParams (required), body, query.
ruddur_update_media_assetA
Update creator media metadata. The MCP server accepts media aliases such as title/name, mimeType/contentType, size/fileSize, and heading/waypoint/listing identifiers. Requires scope: media.manage.
Inputs: pathParams (required), body, query.
ruddur_update_waypointAIdempotent
Update a creator-owned Waypoint. Omit assessmentConfig for ordinary waypoints; include it only for explicit assessment-style waypoints. The MCP server maps creatorAssessmentConfig to assessmentConfig when provided. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_update_waypoint_noteBIdempotent
Update a Waypoint note. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_update_waypoint_placementA
Update a Waypoint placement. The MCP server accepts placement aliases such as heading, index, state, and sortOrder. Requires scope: content.manage.
Inputs: pathParams (required), body, query.
ruddur_verify_entitlementARead-only
Verify a user's entitlement to a creator listing. The MCP server accepts marketplaceListingId and customerUserId aliases. Requires one of scope: marketplace.entitlements, marketplace.manage.
Inputs: body, query.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 53 tools
Most tools have a clear resource+action mapping (headings, waypoints, media, marketplace). A few close pairs like attach_waypoint vs update_waypoint_placement and create/import/apply_template/clone for headings could cause confusion, but the descriptions help distinguish them.
Every tool uses the consistent ruddur_verb_noun pattern with snake_case. The only minor deviation is list_my_marketplace_listings, which includes an extra 'my' but remains readable and predictable.
53 tools is far beyond the typical 3-15 range and even exceeds the 25+ threshold. While the broad scope (content, media, marketplace, billing) explains the count, the sheer number makes the server heavy and likely overwhelming for agents.
The tool surface covers CRUD for most resources (headings, waypoints, media, marketplace listings) plus snapshots, templates, collaborators, notes, coupons, and entitlements. However, there are no direct getters for waypoints, media assets, or marketplace listings, and coupons lack a delete operation.
Maintenance
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceAn MCP server that enables natural language interaction with the Notion API, allowing users to search, comment, create pages, and access content within their Notion workspace.270,649 npm-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables natural language interaction with Google's Discovery Engine API, allowing users to search, recommend, and manage data through conversational interfaces.-
- AlicenseCqualityDmaintenanceA lightweight MCP server that connects to WordPress via REST API, enabling content management (posts, pages, categories, etc.) and site configuration through natural language commands.49Apache 2.0
- FlicenseNot gradedqualityDmaintenanceMCP server for the Runn API, enabling resource management and reporting through natural language.-