Skip to main content
Glama
railyard-sh

Railyard MCP Server

by railyard-sh

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
RAILYARD_ORGNoDefault org (id or slug) for org-scoped tools.
RAILYARD_TOKENYesYour personal access token (ry_… secret). Required for authentication.
RAILYARD_BASE_URLNoRailyard base URL. Defaults to https://railyard.sh; override only for self-hosted or local Railyard.https://railyard.sh

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
whoamiA

Return the Railyard user the configured personal access token authenticates as (id, email, name). Use this to confirm the token works and which account it belongs to.

list_orgsA

List the organisations the token's user belongs to, with each org's id, slug, role (viewer/editor/owner), plan and billing status. The id or slug is what you pass as the org argument to other tools.

list_projectsA

List projects in an organisation (id, name, slug, last-updated time). Omit org to use the default organisation.

get_projectA

Fetch a project's full JSON document and revision ETag, addressed by id or URL slug. The project contains the complete estate model, including the flexible container hierarchy, racks and placements, device roles, review dismissals, cabling and power. Pass revision to update_project when applying work derived from this response so concurrent changes are not overwritten.

check_project_nameA

Check whether a project name is free in an organisation (and see the URL slug it would get). Optionally exclude a project id so a rename that keeps its own name reads as available.

server_infoA

Report the Railyard server's health and capabilities: version, the project schemaVersion it understands, whether persistence (a database) and authentication are enabled, and whether Stripe billing is configured. Useful to confirm the server is reachable and which features exist.

list_export_formatsA

List the export targets this Railyard build supports — each format's id (what export_project takes), a one-line description, and the file extension it produces.

validate_projectA

Run the current Railyard server-side soft validation over a project: rack placement/site findings and power-model problems. Structurally invalid documents, including malformed hierarchy or cabling references, are rejected before this report. Each raw problem carries a severity, stable code, message and relevant rack or placement ids. Nothing is saved; the interactive app may group or dismiss eligible review findings separately.

export_projectA

Export a project into a downstream format (see list_export_formats for the ids — e.g. nautobot-csv, netbox-csv, designbuilder-yaml, json) and return the generated files' content, plus any unresolved placements and warnings. A placement whose deviceTypeRef matches no catalogue entry is REPORTED, never silently dropped: set placeholders=true to emit it as a placeholder device type so the row still imports. Targets that need prerequisite objects return the whole ordered bundle, not just the headline table. Large files are truncated in the reply — the app's download gives the complete artefact.

create_projectA

Create a new, empty project with the given name and save it to the organisation. Returns the new project's id and URL slug. Fails with a conflict if the name is already taken in the org. (Write: requires the token user to have an editor/owner role in the org.)

update_projectA

Save changes to an existing project via a full-document PUT. DESTRUCTIVE: the saved document REPLACES the stored one. By default (merge=true) the given project fields are shallow-merged over the current document (only the top-level keys you supply are replaced, e.g. pass just {racks:[…]} to swap the racks) — recommended. With merge=false, project is taken as the entire new document and must be a complete, valid project. The project's real id is always preserved. Concurrent browser or MCP saves are guarded by revision checks: a stale update is refused instead of overwriting newer work.

rename_projectA

Rename a project. Updates both its display name and its URL slug together, after checking the new name is unique in the org. Returns the new slug. (Write: editor/owner role required.)

delete_projectA

Permanently delete a project and its entire estate. DESTRUCTIVE and NOT reversible — there is no undo. Any live collaboration sessions on it are dropped. (Write: editor/owner role required.)

move_projectA

Move a project out of its current organisation into another one the token user can write to. toOrg is the destination org (id, slug or name); org is the source org it currently lives in (defaults as usual). Requires an editor/owner role in BOTH organisations. If the name is already taken in the destination the move conflicts (409) — pass name to rename the project as part of the move; check_project_name against toOrg tells you in advance.

create_orgA

Create a new shared organisation; the token's user becomes its owner. Returns the org's id and slug, which other tools accept as org. Note that adding members to it needs a Team or Enterprise plan (see get_billing).

rename_orgA

Change an organisation's display name. Requires the OWNER role in it.

delete_orgA

Permanently delete a shared organisation AND every project inside it. DESTRUCTIVE and NOT reversible. Requires the OWNER role. A personal organisation cannot be deleted (400). Move out any project you want to keep first (see move_project).

get_org_catalogA

Read an organisation's shared device-type library — the catalogue of device types available to every project in the org, separate from each project's own catalogue. Returns the complete catalogue plus its revision; pass that revision to set_org_catalog. Any member may read it.

set_org_catalogA

Replace an organisation's shared device-type library with the given array. DESTRUCTIVE: this is a whole-library write, not a merge — types absent from catalogue are removed. Read the current library with get_org_catalog and send it back with your additions plus its revision. The write fails rather than overwriting a concurrent change. Requires an editor/owner role.

get_org_rolesA

Read an organisation's shared device-role vocabulary. Returns the complete roles array and its revision; pass that revision to set_org_roles. Project-level deviceRoles are layered on top.

set_org_rolesA

Replace an organisation's shared device-role vocabulary. This is a whole-array write: read it with get_org_roles, preserve the entries you still need, and pass back that response's revision. The write fails rather than overwriting a concurrent change. Requires an editor/owner role.

list_membersA

List an organisation's members — user id, email, name, role (viewer/editor/owner) and when they joined. Any member may read the roster. The user id is what set_member_role and remove_member take.

set_member_roleA

Change an existing member's role in an organisation. Requires the OWNER role. Demoting the last remaining owner is refused (409) — promote someone else first. The member's live collaboration sessions are dropped so they reconnect with the new role.

remove_memberA

Remove a member from an organisation, revoking their access to all of its projects and dropping their live sessions at once. Requires the OWNER role. Removing the last owner is refused (409). The subscription's seat count is reconciled afterwards.

list_invitesA

List an organisation's pending invitations (email, role, when sent). Requires the OWNER role, since the list holds the addresses of people who are not members yet.

invite_memberA

Invite an email address to join an organisation at a role (default editor), and email them the invitation where the server has mail configured. Requires the OWNER role, and a current Team or Enterprise plan — a personal or Individual-plan org cannot add members (402), and neither can one whose plan has lapsed. Re-inviting a still-pending email updates its role. An address that is already a member is refused (409).

revoke_inviteA

Withdraw a pending invitation so it can no longer be accepted. Requires the OWNER role. Has no effect on someone who has already joined — use remove_member for that.

list_my_invitesA

List invitations addressed to the token user's own email — organisations they have been invited to but not yet joined. Pass an id from here to accept_invite.

accept_inviteA

Accept an invitation addressed to the token user's email, joining that organisation at the invited role. Returns the joined org. Refused (403) if the invitation was addressed to someone else, and (402) if the organisation's plan has lapsed or been downgraded since the invitation was sent.

get_billingA

Read an organisation's plan and billing state: plan (individual/team/enterprise), status (trialing/active/past_due/canceled), seat count, trial end, current period end, whether it is currently entitled to edit (a lapsed org is read-only and its writes return 402), whether the caller may manage billing, and whether this server has Stripe self-serve configured at all. Any member may read it.

billing_manage_urlA

Mint a Stripe hosted-page URL for the organisation's OWNER to open in a browser: action=subscribe opens Checkout to start a subscription, action=manage opens the Customer Portal to change the card, switch plan or cancel. This only creates a link — it does not charge anything or change the subscription; the owner completes or abandons that on Stripe's page. Requires the OWNER role and Stripe configured on the server (503 otherwise). action=subscribe conflicts (409) when a live subscription already exists — manage it instead; action=manage needs an existing billing account (400 before the first subscription).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.1/5.0

Scored across 31 tools

Disambiguation5/5

Each tool maps to a distinct resource and action—org, project, member, invite, billing, catalog/roles, validation/export—so there is little risk of selecting the wrong one. The only close pair, list_invites and list_my_invites, is clearly differentiated by scope (org-owned vs token user's).

Naming Consistency4/5

The vast majority follow a consistent verb_noun snake_case pattern (list_projects, set_member_role, accept_invite). Exceptions like whoami, server_info, and especially billing_manage_url break the pattern without causing real confusion.

Tool Count2/5

At 31 tools, this sits well beyond the 25+ threshold for a single server and will require agents to manage a large option set. The broad API scope explains the size, but it is still heavier than ideal for an MCP tool surface.

Completeness5/5

The server covers full lifecycle CRUD for organisations and projects, plus membership/invitation management, org-level catalog/roles, billing, validation, and export. I don't see obvious dead ends: writes have matching reads, destructive operations have guards, and the billing flow links out to Stripe where needed.

Maintenance

ActivityMaintained
ResponsivenessNo issues