Railyard MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RAILYARD_ORG | No | Default org (id or slug) for org-scoped tools. | |
| RAILYARD_TOKEN | Yes | Your personal access token (ry_… secret). Required for authentication. | |
| RAILYARD_BASE_URL | No | Railyard 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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 |
| list_projectsA | List projects in an organisation (id, name, slug, last-updated time). Omit |
| 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 |
| check_project_nameA | Check whether a project name is free in an organisation (and see the URL slug it would get). Optionally |
| 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 |
| 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. |
| 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 |
| 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 |
| 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 |
| get_org_rolesA | Read an organisation's shared device-role vocabulary. Returns the complete |
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 31 tools
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).
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.
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.
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.