The Railway connector lets Claude work with your Railway workspaces directly.
Claude can take actions: create new projects, deploy services from your connected GitHub repositories, redeploy services, manage feature flags, and publish self-contained artifacts (a static page, a React component, a diagram) to a public URL in seconds via Railway Functions.
It can also list your projects, services, and deployments, check the live status of an environment, and pull build, deploy, and HTTP logs to help you debug production issues without leaving the conversation.
For complex, multi-step operations, the connector includes railway-agent, a conversational bridge to Railway's own infrastructure agent, which can inspect services, diagnose failures, and apply configuration changes on your behalf. Destructive actions are gated behind explicit confirmation, and everything is scoped to the projects and workspaces your Railway account can access.
Protocol
MCP 2026-07-28
Server version
1.0.0
Supports
Tools
Overall score
A
Overall quality score: 88 out of 10088/100
Server metadata
4 of 8 fields50/1005 / 10 pts
Identity, discovery, and usage metadata advertised during the MCP handshake.
Use this MCP to deploy, manage, and debug applications on Railway. Call the direct tools for reads and routine operations — listing projects/services/variables/domains, inspecting config, status, logs, metrics, setting variables, updating service settings, creating services, and searching the Railway docs. Reach for the `railway-agent` tool when a task is genuinely complex or open-ended (multi-service debugging, incident investigation, operations that span many steps or need Railway-side reasoning). Fall back to the local Railway CLI when needed. Confirm with the user before destructive actions (e.g. `accept-deploy`).
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Create a new service from a GitHub repository and trigger its first deployment. The repo must be one the authenticated user has connected via GitHub. Returns the new service; use get-status or list-deployments to follow the deploy.
Before calling this tool you MUST have a GitHub repo to deploy. If the user has not provided one, do not guess — first ask them which GitHub repo to deploy (in 'owner/name' form). If they don't have a repo yet, offer to help create one: if you have tools available to create a GitHub repository (e.g. a GitHub MCP server or `gh` CLI), offer to scaffold and push one for them; otherwise point them to create a repo on GitHub and share its 'owner/name'. Only call this tool once a concrete repo has been confirmed.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID to deploy into
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
repo
The full name of the GitHub repo to deploy. e.g. 'railwayapp/starters'
Clear enough to supply this argument.
branch
The branch to deploy. Defaults to 'main'. A branch is required to trigger the first deploy.
Clear enough to supply this argument.
environmentId
Environment ID to deploy into. If omitted, the service is created in all non-fork environments.
Clear enough to supply this argument.
name
Name for the new service. If omitted, a name is derived from the repo.
{
"name": "create-deployment",
"description": "Create a new service from a GitHub repository and trigger its first deployment. The repo must be one the authenticated user has connected via GitHub. Returns the new service; use get-status or list-deployments to follow the deploy.\n\nBefore calling this tool you MUST have a GitHub repo to deploy. If the user has not provided one, do not guess — first ask them which GitHub repo to deploy (in 'owner/name' form). If they don't have a repo yet, offer to help create one: if you have tools available to create a GitHub repository (e.g. a GitHub MCP server or `gh` CLI), offer to scaffold and push one for them; otherwise point them to create a repo on GitHub and share its 'owner/name'. Only call this tool once a concrete repo has been confirmed.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"repo"
],
"properties": {
"name": {
"type": "string",
"description": "Name for the new service. If omitted, a name is derived from the repo."
},
"repo": {
"type": "string",
"description": "The full name of the GitHub repo to deploy. e.g. 'railwayapp/starters'"
},
"branch": {
"type": "string",
"description": "The branch to deploy. Defaults to 'main'. A branch is required to trigger the first deploy."
},
"projectId": {
"type": "string",
"description": "The project ID to deploy into"
},
"environmentId": {
"type": "string",
"description": "Environment ID to deploy into. If omitted, the service is created in all non-fork environments."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"project",
"source",
"environment",
"deploymentStatus"
],
"properties": {
"source": {
"type": "object",
"required": [
"repo",
"branch"
],
"properties": {
"repo": {
"type": "string",
"description": "GitHub repository in owner/name form"
},
"branch": {
"type": "string",
"description": "Git branch selected for deployment"
}
},
"additionalProperties": false
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Destination project ID"
},
"name": {
"type": "string",
"description": "Destination project name"
}
},
"additionalProperties": false
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Created service ID"
},
"name": {
"type": "string",
"description": "Created service name"
}
},
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Specific environment ID, or null when all non-fork environments are used"
},
"scope": {
"enum": [
"specific",
"all_non_fork"
],
"type": "string",
"description": "Whether the service was created in one or all non-fork environments"
}
},
"additionalProperties": false
},
"deploymentStatus": {
"type": "string",
"const": "triggered",
"description": "Initial deployment was triggered asynchronously"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create deployment",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Create a new service in a project from a Docker image, or an empty service to configure later (e.g. before setting variables and attaching a source). Public images only: credentials for a private registry are not accepted here — the user sets them on the service in the Railway dashboard. Pass staged: true to stage the service in one environment instead of applying it live — it then only becomes real when the staged changes are committed with accept-deploy. To create a service from a GitHub repository, use create-deployment instead.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID to create the service in
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
name
Name for the new service. If omitted, a name is derived from the image or generated.
Clear enough to supply this argument.
image
Docker image to deploy, e.g. 'redis' or 'ghcr.io/org/app:latest'. Omit to create an empty service.
Clear enough to supply this argument.
environmentId
Environment ID to create the service in. If omitted, the service is created in all non-fork environments. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the service in the environment's pending changes instead of applying it live. The service shows up on the canvas immediately but gets no instance until accept-deploy commits the staged changes (or the user applies them in the dashboard). Requires environmentId.
{
"name": "create-service",
"description": "Create a new service in a project from a Docker image, or an empty service to configure later (e.g. before setting variables and attaching a source). Public images only: credentials for a private registry are not accepted here — the user sets them on the service in the Railway dashboard. Pass staged: true to stage the service in one environment instead of applying it live — it then only becomes real when the staged changes are committed with accept-deploy. To create a service from a GitHub repository, use create-deployment instead.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId"
],
"properties": {
"name": {
"type": "string",
"description": "Name for the new service. If omitted, a name is derived from the image or generated."
},
"image": {
"type": "string",
"description": "Docker image to deploy, e.g. 'redis' or 'ghcr.io/org/app:latest'. Omit to create an empty service."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the service in the environment's pending changes instead of applying it live. The service shows up on the canvas immediately but gets no instance until accept-deploy commits the staged changes (or the user applies them in the dashboard). Requires environmentId."
},
"projectId": {
"type": "string",
"description": "The project ID to create the service in"
},
"environmentId": {
"type": "string",
"description": "Environment ID to create the service in. If omitted, the service is created in all non-fork environments. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"project",
"source",
"environment",
"staged"
],
"properties": {
"source": {
"anyOf": [
{
"type": "object",
"required": [
"image"
],
"properties": {
"image": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Docker image source, or null for an empty service"
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the service was staged instead of applied. The service exists but has no instance until the staged changes are committed with accept-deploy."
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"enum": [
"specific",
"all_non_fork"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create service",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Update a service's configuration: build/start/pre-deploy commands and pre-deploy timeout, builder, healthcheck, sleep mode, root directory, cron schedule, Dockerfile path, restart policy, config file path, watch patterns, replicas per region, resource limits, deployment overlap/draining, outbound IPv6, and the private network endpoint name. Only the fields you pass are changed. Config changes apply on the service's next deployment (use redeploy to apply immediately); regions and limits scale the running deployment right away, and privateNetworkEndpoint is committed to the environment and redeploys the service. Pass staged: true to stage the update in one environment's pending changes instead of writing it to the service — it then applies when the staged changes are committed with accept-deploy. Source changes are not handled by this tool (use connect-service-source), and private registry credentials are set by the user in the Railway dashboard.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
23 of 26 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment to update. If omitted, the service is updated in all environments. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Clear enough to supply this argument.
buildCommand
Custom build command
Explain the meaning of this value, not just its name.
startCommand
Custom start command
Explain the meaning of this value, not just its name.
preDeployCommand
Commands run before each deploy
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preDeployTimeoutSeconds
How long the pre-deploy command may run, in seconds (1-3600). Pass null to reset to the default.
Resolve the mismatch between this description and its schema constraints.
healthcheckPath
HTTP healthcheck path, e.g. /health
Clear enough to supply this argument.
healthcheckTimeout
Healthcheck timeout in seconds (0-3600). Pass null to reset.
Resolve the mismatch between this description and its schema constraints.
sleepApplication
Enable/disable app sleeping (serverless mode)
Clear enough to supply this argument.
ipv6EgressEnabled
Enable/disable outbound IPv6 internet access
Clear enough to supply this argument.
rootDirectory
Root directory for builds, e.g. /packages/api. With staged: true this counts as a source change: committing it recreates the service's deployment triggers and re-resolves its GitHub authorization from whoever commits. Stage it on its own if that matters.
Clear enough to supply this argument.
cronSchedule
Cron schedule, e.g. '0 * * * *'. Minimum interval is 5 minutes. Pass null to remove the schedule and run the service continuously.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
restartPolicyType
Restart policy for crashed deployments
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
restartPolicyMaxRetries
Max restart retries for ON_FAILURE policy
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
builder
Build system for services without a Dockerfile. RAILPACK is the default; NIXPACKS is the legacy builder.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dockerfilePath
Path to a custom Dockerfile
Clear enough to supply this argument.
railwayConfigFile
Path to a railway config file, e.g. railway.toml
Clear enough to supply this argument.
watchPatterns
File patterns that trigger automatic redeploys
Clear enough to supply this argument.
regions › additionalProperties › numReplicas
Not provided
Missing description. Explain what this value means and how to supply it.
limits › vCPUs
Not provided
Missing description. Explain what this value means and how to supply it.
limits › memoryGB
Not provided
Missing description. Explain what this value means and how to supply it.
drainingSeconds
Seconds between the old deployment's containers receiving SIGTERM and SIGKILL. Pass null to reset to the default.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
overlapSeconds
Seconds the old deployment keeps serving after the new one is healthy. Pass null to reset to the default.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateNetworkEndpoint
The service's private DNS label, reachable as <label>.railway.internal: lowercase letters, digits and hyphens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environmentId",
"updatedFields",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environmentId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Environment updated, or null when all environments were"
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "update-service",
"description": "Update a service's configuration: build/start/pre-deploy commands and pre-deploy timeout, builder, healthcheck, sleep mode, root directory, cron schedule, Dockerfile path, restart policy, config file path, watch patterns, replicas per region, resource limits, deployment overlap/draining, outbound IPv6, and the private network endpoint name. Only the fields you pass are changed. Config changes apply on the service's next deployment (use redeploy to apply immediately); regions and limits scale the running deployment right away, and privateNetworkEndpoint is committed to the environment and redeploys the service. Pass staged: true to stage the update in one environment's pending changes instead of writing it to the service — it then applies when the staged changes are committed with accept-deploy. Source changes are not handled by this tool (use connect-service-source), and private registry credentials are set by the user in the Railway dashboard.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"limits": {
"type": "object",
"properties": {
"vCPUs": {
"type": "number",
"exclusiveMinimum": 0
},
"memoryGB": {
"type": "number",
"exclusiveMinimum": 0
}
},
"description": "Resource limits per replica, capped by the workspace plan. Only the values you pass change."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"builder": {
"enum": [
"RAILPACK",
"NIXPACKS"
],
"type": "string",
"description": "Build system for services without a Dockerfile. RAILPACK is the default; NIXPACKS is the legacy builder."
},
"regions": {
"type": "object",
"description": "Replicas per region, e.g. { \"us-west2\": { \"numReplicas\": 2 } }. Replaces the whole region map: a region absent from it is removed. Services with a volume run in one region only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"numReplicas"
],
"properties": {
"numReplicas": {
"type": "integer",
"maximum": 200,
"minimum": 1
}
}
}
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"buildCommand": {
"type": "string",
"description": "Custom build command"
},
"cronSchedule": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
],
"description": "Cron schedule, e.g. '0 * * * *'. Minimum interval is 5 minutes. Pass null to remove the schedule and run the service continuously."
},
"startCommand": {
"type": "string",
"description": "Custom start command"
},
"environmentId": {
"type": "string",
"description": "Environment to update. If omitted, the service is updated in all environments. Required when staged is true."
},
"rootDirectory": {
"type": "string",
"description": "Root directory for builds, e.g. /packages/api. With staged: true this counts as a source change: committing it recreates the service's deployment triggers and re-resolves its GitHub authorization from whoever commits. Stage it on its own if that matters."
},
"watchPatterns": {
"type": "array",
"items": {
"type": "string"
},
"description": "File patterns that trigger automatic redeploys"
},
"dockerfilePath": {
"type": "string",
"description": "Path to a custom Dockerfile"
},
"overlapSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Seconds the old deployment keeps serving after the new one is healthy. Pass null to reset to the default."
},
"drainingSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Seconds between the old deployment's containers receiving SIGTERM and SIGKILL. Pass null to reset to the default."
},
"healthcheckPath": {
"type": "string",
"description": "HTTP healthcheck path, e.g. /health"
},
"preDeployCommand": {
"type": "array",
"items": {
"type": "string"
},
"description": "Commands run before each deploy"
},
"sleepApplication": {
"type": "boolean",
"description": "Enable/disable app sleeping (serverless mode)"
},
"ipv6EgressEnabled": {
"type": "boolean",
"description": "Enable/disable outbound IPv6 internet access"
},
"railwayConfigFile": {
"type": "string",
"description": "Path to a railway config file, e.g. railway.toml"
},
"restartPolicyType": {
"enum": [
"ALWAYS",
"NEVER",
"ON_FAILURE"
],
"type": "string",
"description": "Restart policy for crashed deployments"
},
"healthcheckTimeout": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Healthcheck timeout in seconds (0-3600). Pass null to reset."
},
"privateNetworkEndpoint": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The service's private DNS label, reachable as <label>.railway.internal: lowercase letters, digits and hyphens."
},
"preDeployTimeoutSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "How long the pre-deploy command may run, in seconds (1-3600). Pass null to reset to the default."
},
"restartPolicyMaxRetries": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Max restart retries for ON_FAILURE policy"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environmentId",
"updatedFields",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environmentId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Environment updated, or null when all environments were"
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update service",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Permanently delete a service: its deployments stop and are removed, along with its domains, variables and deployment triggers. Any volume attached to it is detached and kept — delete-volume removes a volume and its data. By default the service is deleted in every environment that is not a fork; pass an environmentId to delete it in that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. A service whose creation is itself still staged is taken back out of the pending changes instead. This cannot be undone.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID the service belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID to delete
Clear enough to supply this argument.
environmentId
Environment to delete the service in. If omitted, it is deleted in every environment that is not a fork. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environmentId",
"detachedVolumes",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environmentId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Environment the service was removed from, or null for all"
},
"detachedVolumes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Volumes detached from the service and kept — on commit, when the removal is staged. Their data outlives the service; delete-volume is what removes it."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-service",
"description": "Permanently delete a service: its deployments stop and are removed, along with its domains, variables and deployment triggers. Any volume attached to it is detached and kept — delete-volume removes a volume and its data. By default the service is deleted in every environment that is not a fork; pass an environmentId to delete it in that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. A service whose creation is itself still staged is taken back out of the pending changes instead. This cannot be undone.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID the service belongs to"
},
"serviceId": {
"type": "string",
"description": "The service ID to delete"
},
"environmentId": {
"type": "string",
"description": "Environment to delete the service in. If omitted, it is deleted in every environment that is not a fork. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environmentId",
"detachedVolumes",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environmentId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Environment the service was removed from, or null for all"
},
"detachedVolumes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Volumes detached from the service and kept — on commit, when the removal is staged. Their data outlives the service; delete-volume is what removes it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete service",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Create a Railway Function: a service that runs one file of TypeScript on the Bun runtime, with no repository, Dockerfile or build step. Use this for webhook receivers, small HTTP APIs, cron jobs and scripts. Pass the complete code — a function with no code deploys nothing.
Applies live by default, which deploys the function immediately. Pass staged: true with an environmentId to stage it in that environment's pending changes instead, in which case nothing deploys until the staged changes are committed with accept-deploy.
For a service built from a repository use create-deployment, and for one from a Docker image use create-service. To change a function's code afterwards use update-function-source-code; for its other settings (variables, cron schedule, healthcheck) use set-variables and update-service.
Writing function code:
- One file, TypeScript or TSX. The runtime writes it to `index.tsx` and runs it with Bun — Python, Go, Ruby and other languages will not run. For those, use create-service with an image, or create-deployment from a repo.
- Imports are allowed. The runtime scans them, generates a package.json and installs with Bun, including versioned specifiers like `hono@4` and `zod@3`. Do not reference local files other than this one.
- An HTTP service must listen: call `Bun.serve`, or default-export a fetch handler or Hono app. Read the port from `Bun.env.PORT`. Use generate-domain to give it a public URL.
- If it is not an HTTP service, do not start a server. Write a script; it runs to completion.
- Do not schedule work with a top-level `setInterval` — set a cronSchedule with update-service instead.
- Prefer Bun globals over Node APIs: `Bun.env` for variables, `Bun.file`/`Bun.write` for file I/O, `Bun.sql` for Postgres, `Bun.s3` for object storage. The function filesystem is not durable — persist to a database or object storage.
- Top-level await is available. Await every async call.
- JSX needs the pragma, e.g. `/** @jsx jsx */` with `/** @jsxImportSource hono/jsx */`.
- Send complete, working code. Placeholders and elided bodies get deployed as written.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID to create the function in
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
code
The function's complete TypeScript/TSX source, as one file. This is what gets deployed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Name for the new function. If omitted, a name is generated.
Clear enough to supply this argument.
environmentId
Environment ID to create the function in. If omitted, it is created in all non-fork environments. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the function in the environment's pending changes instead of deploying it. It shows up on the canvas immediately but gets no instance until accept-deploy commits the staged changes (or the user applies them in the dashboard). Requires environmentId.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"project",
"runtime",
"version",
"environment",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the function was staged instead of deployed. The service exists but has no instance until the staged changes are committed with accept-deploy."
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"enum": [
"specific",
"all_non_fork"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-function",
"description": "Create a Railway Function: a service that runs one file of TypeScript on the Bun runtime, with no repository, Dockerfile or build step. Use this for webhook receivers, small HTTP APIs, cron jobs and scripts. Pass the complete code — a function with no code deploys nothing.\n\nApplies live by default, which deploys the function immediately. Pass staged: true with an environmentId to stage it in that environment's pending changes instead, in which case nothing deploys until the staged changes are committed with accept-deploy.\n\nFor a service built from a repository use create-deployment, and for one from a Docker image use create-service. To change a function's code afterwards use update-function-source-code; for its other settings (variables, cron schedule, healthcheck) use set-variables and update-service.\n\nWriting function code:\n- One file, TypeScript or TSX. The runtime writes it to `index.tsx` and runs it with Bun — Python, Go, Ruby and other languages will not run. For those, use create-service with an image, or create-deployment from a repo.\n- Imports are allowed. The runtime scans them, generates a package.json and installs with Bun, including versioned specifiers like `hono@4` and `zod@3`. Do not reference local files other than this one.\n- An HTTP service must listen: call `Bun.serve`, or default-export a fetch handler or Hono app. Read the port from `Bun.env.PORT`. Use generate-domain to give it a public URL.\n- If it is not an HTTP service, do not start a server. Write a script; it runs to completion.\n- Do not schedule work with a top-level `setInterval` — set a cronSchedule with update-service instead.\n- Prefer Bun globals over Node APIs: `Bun.env` for variables, `Bun.file`/`Bun.write` for file I/O, `Bun.sql` for Postgres, `Bun.s3` for object storage. The function filesystem is not durable — persist to a database or object storage.\n- Top-level await is available. Await every async call.\n- JSX needs the pragma, e.g. `/** @jsx jsx */` with `/** @jsxImportSource hono/jsx */`.\n- Send complete, working code. Placeholders and elided bodies get deployed as written.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1,
"description": "The function's complete TypeScript/TSX source, as one file. This is what gets deployed."
},
"name": {
"type": "string",
"description": "Name for the new function. If omitted, a name is generated."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the function in the environment's pending changes instead of deploying it. It shows up on the canvas immediately but gets no instance until accept-deploy commits the staged changes (or the user applies them in the dashboard). Requires environmentId."
},
"projectId": {
"type": "string",
"description": "The project ID to create the function in"
},
"environmentId": {
"type": "string",
"description": "Environment ID to create the function in. If omitted, it is created in all non-fork environments. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"project",
"runtime",
"version",
"environment",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the function was staged instead of deployed. The service exists but has no instance until the staged changes are committed with accept-deploy."
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"enum": [
"specific",
"all_non_fork"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create function",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Replace a Railway Function's source code. Send the complete file — this overwrites the function's code, it does not patch it, so anything you leave out is gone. Read the current code with get-function-source-code first if you are modifying rather than rewriting.
Applies live by default, which deploys the new code immediately. Pass staged: true to stage it in the environment's pending changes instead, in which case the current code keeps running until the staged changes are committed with accept-deploy.
Updates one environment: the one you name, or the default environment. Code is the thing a function is, and a live update deploys it, so this does not fan out across every environment the way update-service does — call it per environment if you need that. For a function's other settings (variables, cron schedule, healthcheck, domains) use set-variables, update-service and generate-domain. For a service built from a repo or image, this is the wrong tool: use connect-service-source or redeploy.
Writing function code:
- One file, TypeScript or TSX. The runtime writes it to `index.tsx` and runs it with Bun — Python, Go, Ruby and other languages will not run. For those, use create-service with an image, or create-deployment from a repo.
- Imports are allowed. The runtime scans them, generates a package.json and installs with Bun, including versioned specifiers like `hono@4` and `zod@3`. Do not reference local files other than this one.
- An HTTP service must listen: call `Bun.serve`, or default-export a fetch handler or Hono app. Read the port from `Bun.env.PORT`. Use generate-domain to give it a public URL.
- If it is not an HTTP service, do not start a server. Write a script; it runs to completion.
- Do not schedule work with a top-level `setInterval` — set a cronSchedule with update-service instead.
- Prefer Bun globals over Node APIs: `Bun.env` for variables, `Bun.file`/`Bun.write` for file I/O, `Bun.sql` for Postgres, `Bun.s3` for object storage. The function filesystem is not durable — persist to a database or object storage.
- Top-level await is available. Await every async call.
- JSX needs the pragma, e.g. `/** @jsx jsx */` with `/** @jsxImportSource hono/jsx */`.
- Send complete, working code. Placeholders and elided bodies get deployed as written.
The description explains the capability, when to use it, and what to expect.
Inputs60/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The function service ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
code
The function's complete new TypeScript/TSX source, as one file. Replaces the existing code entirely.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
staged
Stage the new code in the environment's pending changes instead of deploying it. The currently deployed code keeps running until the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"runtime",
"version",
"changed",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"changed": {
"type": "boolean",
"description": "False when the function already had this exact code, in which case nothing was written or deployed"
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "update-function-source-code",
"description": "Replace a Railway Function's source code. Send the complete file — this overwrites the function's code, it does not patch it, so anything you leave out is gone. Read the current code with get-function-source-code first if you are modifying rather than rewriting.\n\nApplies live by default, which deploys the new code immediately. Pass staged: true to stage it in the environment's pending changes instead, in which case the current code keeps running until the staged changes are committed with accept-deploy.\n\nUpdates one environment: the one you name, or the default environment. Code is the thing a function is, and a live update deploys it, so this does not fan out across every environment the way update-service does — call it per environment if you need that. For a function's other settings (variables, cron schedule, healthcheck, domains) use set-variables, update-service and generate-domain. For a service built from a repo or image, this is the wrong tool: use connect-service-source or redeploy.\n\nWriting function code:\n- One file, TypeScript or TSX. The runtime writes it to `index.tsx` and runs it with Bun — Python, Go, Ruby and other languages will not run. For those, use create-service with an image, or create-deployment from a repo.\n- Imports are allowed. The runtime scans them, generates a package.json and installs with Bun, including versioned specifiers like `hono@4` and `zod@3`. Do not reference local files other than this one.\n- An HTTP service must listen: call `Bun.serve`, or default-export a fetch handler or Hono app. Read the port from `Bun.env.PORT`. Use generate-domain to give it a public URL.\n- If it is not an HTTP service, do not start a server. Write a script; it runs to completion.\n- Do not schedule work with a top-level `setInterval` — set a cronSchedule with update-service instead.\n- Prefer Bun globals over Node APIs: `Bun.env` for variables, `Bun.file`/`Bun.write` for file I/O, `Bun.sql` for Postgres, `Bun.s3` for object storage. The function filesystem is not durable — persist to a database or object storage.\n- Top-level await is available. Await every async call.\n- JSX needs the pragma, e.g. `/** @jsx jsx */` with `/** @jsxImportSource hono/jsx */`.\n- Send complete, working code. Placeholders and elided bodies get deployed as written.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1,
"description": "The function's complete new TypeScript/TSX source, as one file. Replaces the existing code entirely."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the new code in the environment's pending changes instead of deploying it. The currently deployed code keeps running until the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The function service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"runtime",
"version",
"changed",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"changed": {
"type": "boolean",
"description": "False when the function already had this exact code, in which case nothing was written or deployed"
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update function source code",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Get a Railway Function's source code and runtime in an environment. Works for a function that is deployed and for one that exists only as a staged change — `code` is whichever is current, `deployedCode` is what is actually running, and `staged` says whether a commit is pending. Read this before update-function-source-code, which replaces the whole file. For a function's other configuration use get-service-config, and for its variables use list-variables. If environmentId is omitted, the default environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs50/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The function service ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"code",
"codeSource",
"deployedCode",
"runtime",
"version",
"staged"
],
"properties": {
"code": {
"type": "string",
"description": "The function's current source: the staged code when a staged change replaces it, otherwise the deployed code"
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"patchStatus",
"isCreate"
],
"properties": {
"patchId": {
"type": "string"
},
"isCreate": {
"type": "boolean",
"description": "True when the function itself is staged — it does not exist live yet"
},
"patchStatus": {
"type": "string",
"description": "STAGED, or APPLYING while a commit is in flight"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The environment's staged changes for this function, or null when none are pending. Commit them with accept-deploy."
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"codeSource": {
"enum": [
"deployed",
"staged"
],
"type": "string",
"description": "Which of the two `code` came from"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"deployedCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The source that is actually running, or null when the function has never deployed. Equal to `code` unless a staged change replaces it."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-function-source-code",
"description": "Get a Railway Function's source code and runtime in an environment. Works for a function that is deployed and for one that exists only as a staged change — `code` is whichever is current, `deployedCode` is what is actually running, and `staged` says whether a commit is pending. Read this before update-function-source-code, which replaces the whole file. For a function's other configuration use get-service-config, and for its variables use list-variables. If environmentId is omitted, the default environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The function service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"code",
"codeSource",
"deployedCode",
"runtime",
"version",
"staged"
],
"properties": {
"code": {
"type": "string",
"description": "The function's current source: the staged code when a staged change replaces it, otherwise the deployed code"
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"patchStatus",
"isCreate"
],
"properties": {
"patchId": {
"type": "string"
},
"isCreate": {
"type": "boolean",
"description": "True when the function itself is staged — it does not exist live yet"
},
"patchStatus": {
"type": "string",
"description": "STAGED, or APPLYING while a commit is in flight"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The environment's staged changes for this function, or null when none are pending. Commit them with accept-deploy."
},
"runtime": {
"type": "string",
"description": "The function runtime, e.g. 'bun'"
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"version": {
"type": "string",
"description": "The runtime version, e.g. '1.4.0'"
},
"codeSource": {
"enum": [
"deployed",
"staged"
],
"type": "string",
"description": "Which of the two `code` came from"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"deployedCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The source that is actually running, or null when the function has never deployed. Equal to `code` unless a staged change replaces it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get function source code",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List the ids and names of all services and environments in a Railway project. Prefer describe-environment for what is actually in an environment: it includes volumes, buckets, deployments and staged changes.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Input documentation gives an agent enough context to populate the arguments.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Inventory of everything in a Railway environment — services, volumes, buckets, shared variable names — with staged changes applied. Each resource carries a `state`: live, staged-create (exists only in the pending patch), staged-delete, or live-with-staged-changes. Includes each service's source, regions, replicas, cron, volume mounts and latest deployment, and a `staged` summary of the pending patch. Pass `region` to keep only resources in that region. For per-field staged diffs use get-staged-changes; for one service's full config use describe-service; for runtime health use environment-status. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs58/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment to describe. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
region
Only return services deploying to, and volumes/buckets provisioned in, this region (e.g. us-west2, sjc).
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Everything about one service in an environment: its config with staged changes applied (source, build, deploy, networking, volume mounts), the per-field staged changes pending on it, mounted volumes, live domains and TCP proxies, the latest deployment, and its tracing state. `state` says whether the service is live, staged-create, staged-delete, or live-with-staged-changes. Variable names are listed but values are not — use list-variables for values. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Show the changes staged in a Railway environment that accept-deploy would commit: per resource (service, volume, bucket, group) the action — create, delete, update — and each changed field with its live and staged value. Variable values and registry credentials are redacted to names. Also reports whether the patch is destructive and whether a commit is already applying. Review this before calling accept-deploy. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs38/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment to inspect. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Prefer describe-service: it applies the staged changes onto the live config for you and adds mounted volumes, domains, TCP proxies and the latest deployment. Get a service's configuration in an environment: source (repo/image), build settings, deploy settings (start command, healthcheck, replicas, cron, restart policy), networking, and volume mounts. `config` is what is live; `staged` holds the not-yet-deployed changes for this service, or null when nothing is staged. A service created with `staged: true` has an empty `config` until accept-deploy commits it. Variable names are listed but values are not included — use list-variables for values. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs42/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"config",
"variableNames",
"staged"
],
"properties": {
"config": {
"type": "object",
"description": "The service's live serialized config for this environment (source, build, deploy, networking, volume mounts). Variable values are omitted. Empty when the service exists only as a staged change.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"patchStatus",
"changeCount",
"config",
"variableNames"
],
"properties": {
"config": {
"type": "object",
"description": "Only the fields the staged patch sets, in the live config's shape. A field set to null is being cleared. `isCreated: true` means the service does not exist live yet; `isDeleted: true` means it is being removed.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"patchId": {
"type": "string"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of pending changes for this service"
},
"patchStatus": {
"type": "string",
"description": "STAGED, or APPLYING while a commit is in flight"
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of variables the staged changes set or remove."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Changes staged in this environment but not deployed yet, or null when nothing is staged for this service. Commit them with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of variables defined directly on the service"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-service-config",
"description": "Prefer describe-service: it applies the staged changes onto the live config for you and adds mounted volumes, domains, TCP proxies and the latest deployment. Get a service's configuration in an environment: source (repo/image), build settings, deploy settings (start command, healthcheck, replicas, cron, restart policy), networking, and volume mounts. `config` is what is live; `staged` holds the not-yet-deployed changes for this service, or null when nothing is staged. A service created with `staged: true` has an empty `config` until accept-deploy commits it. Variable names are listed but values are not included — use list-variables for values. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"config",
"variableNames",
"staged"
],
"properties": {
"config": {
"type": "object",
"description": "The service's live serialized config for this environment (source, build, deploy, networking, volume mounts). Variable values are omitted. Empty when the service exists only as a staged change.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"patchStatus",
"changeCount",
"config",
"variableNames"
],
"properties": {
"config": {
"type": "object",
"description": "Only the fields the staged patch sets, in the live config's shape. A field set to null is being cleared. `isCreated: true` means the service does not exist live yet; `isDeleted: true` means it is being removed.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"patchId": {
"type": "string"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of pending changes for this service"
},
"patchStatus": {
"type": "string",
"description": "STAGED, or APPLYING while a commit is in flight"
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of variables the staged changes set or remove."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Changes staged in this environment but not deployed yet, or null when nothing is staged for this service. Commit them with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of variables defined directly on the service"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get service config",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Get resource usage metrics (CPU, memory, disk, network) for a service, summarized as current/average/min/max over a time window. Defaults to CPU_USAGE and MEMORY_USAGE_GB over the last hour. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs54/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
measurements
Array of measurement names. Example: ["CPU_USAGE", "MEMORY_USAGE_GB"]. Omit to use those defaults.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hoursBack
Time window in hours, up to 168 (7 days). Defaults to 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sampleRateSeconds
Sampling rate in seconds
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
List all environment variables for a service, fully rendered (reference variables like ${{Postgres.DATABASE_URL}} are resolved). With a Railway session or API token, values are returned in plaintext and may contain secrets. Connected OAuth apps receive variable names only. Sealed variables are always listed by name with no value — they are set, but nobody can read them back, so never recreate one. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs42/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"variableNames",
"sealedVariableNames",
"valuesRedacted"
],
"properties": {
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variables": {
"type": "object",
"description": "Readable variables as a name → value map. Never includes sealed variables. Omitted for OAuth-authenticated clients, which receive names only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "All variable names, sorted, including sealed ones"
},
"valuesRedacted": {
"type": "boolean",
"description": "True when values were withheld and only names are returned"
},
"sealedVariableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the sealed variables, sorted. These are already set on the service; their values cannot be read back by anyone, including the user. Do not treat them as missing and do not recreate them."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-variables",
"description": "List all environment variables for a service, fully rendered (reference variables like ${{Postgres.DATABASE_URL}} are resolved). With a Railway session or API token, values are returned in plaintext and may contain secrets. Connected OAuth apps receive variable names only. Sealed variables are always listed by name with no value — they are set, but nobody can read them back, so never recreate one. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"environment",
"variableNames",
"sealedVariableNames",
"valuesRedacted"
],
"properties": {
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variables": {
"type": "object",
"description": "Readable variables as a name → value map. Never includes sealed variables. Omitted for OAuth-authenticated clients, which receive names only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "All variable names, sorted, including sealed ones"
},
"valuesRedacted": {
"type": "boolean",
"description": "True when values were withheld and only names are returned"
},
"sealedVariableNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the sealed variables, sorted. These are already set on the service; their values cannot be read back by anyone, including the user. Do not treat them as missing and do not recreate them."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List variables",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Set one or more environment variables on a service (or environment-wide shared variables when serviceId is omitted). Existing variables with the same name are overwritten; others are left unchanged. Reference syntax like ${{Postgres.DATABASE_URL}} is supported. Affected services are redeployed unless skipDeploys is true. Pass staged: true to stage the variables in the environment's pending changes instead of setting them live — nothing is written or redeployed until the staged changes are committed with accept-deploy.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service to set variables on. Omit to set environment-level shared variables.
Clear enough to supply this argument.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment. That default applies to staged: true as well — unlike the other staging tools this one never refuses an omitted environmentId, so pass one explicitly unless you mean to stage onto production.
Clear enough to supply this argument.
variables
Object mapping variable names to string values. Example: {"NODE_ENV":"production","PORT":"3000"}.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
skipDeploys
Skip redeploying the affected services. Implied by staged: true, which deploys nothing until the patch is committed.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"serviceId",
"variableNames",
"skippedDeploys",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"serviceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Service the variables were set on, or null for shared"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
}
},
"skippedDeploys": {
"type": "boolean"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-variables",
"description": "Set one or more environment variables on a service (or environment-wide shared variables when serviceId is omitted). Existing variables with the same name are overwritten; others are left unchanged. Reference syntax like ${{Postgres.DATABASE_URL}} is supported. Affected services are redeployed unless skipDeploys is true. Pass staged: true to stage the variables in the environment's pending changes instead of setting them live — nothing is written or redeployed until the staged changes are committed with accept-deploy.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"variables"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service to set variables on. Omit to set environment-level shared variables."
},
"variables": {
"type": "object",
"description": "Object mapping variable names to string values. Example: {\"NODE_ENV\":\"production\",\"PORT\":\"3000\"}.",
"propertyNames": {
"type": "string",
"minLength": 1
},
"additionalProperties": {
"type": "string"
}
},
"skipDeploys": {
"type": "boolean",
"description": "Skip redeploying the affected services. Implied by staged: true, which deploys nothing until the patch is committed."
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment. That default applies to staged: true as well — unlike the other staging tools this one never refuses an omitted environmentId, so pass one explicitly unless you mean to stage onto production."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"serviceId",
"variableNames",
"skippedDeploys",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"serviceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Service the variables were set on, or null for shared"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"variableNames": {
"type": "array",
"items": {
"type": "string"
}
},
"skippedDeploys": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set variables",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Create a persistent volume in a project and optionally attach it to a service at a mount path. The attach and redeploy are committed together so the service comes up with the mount applied. Pass staged: true to stage the volume in one environment instead of provisioning it live.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
mountPath
Path in the container to mount the volume at, e.g. /data
Clear enough to supply this argument.
serviceId
Service to attach the volume to. Omit to create an unattached volume.
Clear enough to supply this argument.
environmentId
Environment to provision the volume in. If omitted, the volume is provisioned in all environments. Required when staged is true.
Clear enough to supply this argument.
name
Name for the volume. If omitted, a name is derived from the service or generated.
Clear enough to supply this argument.
sizeMB
Initial size in MB, up to the plan's maximum volume size. If omitted, the plan's default size is used. The volume can be grown later but not shrunk.
Clear enough to supply this argument.
region
Region to place the volume in, e.g. us-west2 or europe-west4. If omitted, the volume follows the attached service's region, or the workspace's default region.
Clear enough to supply this argument.
staged
Stage the volume in the environment's pending changes instead of provisioning it live. It becomes real only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard). Requires environmentId.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"mountPath",
"serviceId",
"sizeMB",
"region",
"environment",
"staged"
],
"properties": {
"region": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Requested region, or null when the default region applies."
},
"sizeMB": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Requested size in MB, or null when the plan default applies."
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the volume was staged instead of applied. The volume exists but is not provisioned until the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"mountPath": {
"type": "string"
},
"serviceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"enum": [
"specific",
"all"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-volume",
"description": "Create a persistent volume in a project and optionally attach it to a service at a mount path. The attach and redeploy are committed together so the service comes up with the mount applied. Pass staged: true to stage the volume in one environment instead of provisioning it live.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"mountPath"
],
"properties": {
"name": {
"type": "string",
"description": "Name for the volume. If omitted, a name is derived from the service or generated."
},
"region": {
"type": "string",
"description": "Region to place the volume in, e.g. us-west2 or europe-west4. If omitted, the volume follows the attached service's region, or the workspace's default region."
},
"sizeMB": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Initial size in MB, up to the plan's maximum volume size. If omitted, the plan's default size is used. The volume can be grown later but not shrunk.",
"exclusiveMinimum": 0
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the volume in the environment's pending changes instead of provisioning it live. It becomes real only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard). Requires environmentId."
},
"mountPath": {
"type": "string",
"description": "Path in the container to mount the volume at, e.g. /data"
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "Service to attach the volume to. Omit to create an unattached volume."
},
"environmentId": {
"type": "string",
"description": "Environment to provision the volume in. If omitted, the volume is provisioned in all environments. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"mountPath",
"serviceId",
"sizeMB",
"region",
"environment",
"staged"
],
"properties": {
"region": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Requested region, or null when the default region applies."
},
"sizeMB": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Requested size in MB, or null when the plan default applies."
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the volume was staged instead of applied. The volume exists but is not provisioned until the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"mountPath": {
"type": "string"
},
"serviceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"environment": {
"type": "object",
"required": [
"scope",
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scope": {
"enum": [
"specific",
"all"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create volume",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Update a volume's name, mount path, or which service it is attached to. Pass serviceId with mountPath to attach or move the volume; pass serviceId: null to detach it from its service, keeping the data. Every mount change redeploys the affected service so it takes effect. Only the fields you pass are changed. Pass staged: true with an environmentId to stage the mount change in that environment's pending changes instead of applying it live; the volume's name is not environment-scoped and cannot be staged.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
projectId
The project ID the volume belongs to
Clear enough to supply this argument.
volumeId
The volume ID to update
Clear enough to supply this argument.
name
New name for the volume
Clear enough to supply this argument.
mountPath
New mount path, e.g. /data. Redeploys the mounted service.
Clear enough to supply this argument.
environmentId
Environment whose volume instance to update. If omitted, the mount change applies in every environment the volume is provisioned in. Required when staged is true.
Clear enough to supply this argument.
serviceId
Service to attach or move the volume to, together with mountPath. Pass null to detach the volume from its service: the data is kept and the service redeploys without the mount. If omitted, the volume stays on the service it is already attached to.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"updatedFields",
"detachedFrom",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"detachedFrom": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Services the volume was unmounted from, when serviceId was null."
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "update-volume",
"description": "Update a volume's name, mount path, or which service it is attached to. Pass serviceId with mountPath to attach or move the volume; pass serviceId: null to detach it from its service, keeping the data. Every mount change redeploys the affected service so it takes effect. Only the fields you pass are changed. Pass staged: true with an environmentId to stage the mount change in that environment's pending changes instead of applying it live; the volume's name is not environment-scoped and cannot be staged.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"volumeId"
],
"properties": {
"name": {
"type": "string",
"description": "New name for the volume"
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"volumeId": {
"type": "string",
"description": "The volume ID to update"
},
"mountPath": {
"type": "string",
"description": "New mount path, e.g. /data. Redeploys the mounted service."
},
"projectId": {
"type": "string",
"description": "The project ID the volume belongs to"
},
"serviceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Service to attach or move the volume to, together with mountPath. Pass null to detach the volume from its service: the data is kept and the service redeploys without the mount. If omitted, the volume stays on the service it is already attached to."
},
"environmentId": {
"type": "string",
"description": "Environment whose volume instance to update. If omitted, the mount change applies in every environment the volume is provisioned in. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"updatedFields",
"detachedFrom",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"detachedFrom": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Services the volume was unmounted from, when serviceId was null."
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update volume",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Permanently delete a volume and its data. The volume is unmounted from any service it is attached to (redeploying that service). By default it is removed from every environment; pass an environmentId to remove it from that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. Deleting from every environment is irreversible.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Input documentation gives an agent enough context to populate the arguments.
projectId
The project ID the volume belongs to
Clear enough to supply this argument.
volumeId
The volume ID to delete
Clear enough to supply this argument.
environmentId
Environment to remove the volume from. If omitted, it is removed from every environment. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-volume",
"description": "Permanently delete a volume and its data. The volume is unmounted from any service it is attached to (redeploying that service). By default it is removed from every environment; pass an environmentId to remove it from that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. Deleting from every environment is irreversible.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"volumeId"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"volumeId": {
"type": "string",
"description": "The volume ID to delete"
},
"projectId": {
"type": "string",
"description": "The project ID the volume belongs to"
},
"environmentId": {
"type": "string",
"description": "Environment to remove the volume from. If omitted, it is removed from every environment. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"volume",
"staged"
],
"properties": {
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"volume": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete volume",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Create an S3-compatible object storage bucket in a project and provision it in an environment. Default region is sjc. Pass staged: true to stage the bucket in the environment's pending changes instead of provisioning it live — it then only becomes real when the staged changes are committed with accept-deploy.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
name
Name for the bucket. If omitted, a name is generated.
Clear enough to supply this argument.
region
Region to provision the bucket in (default: sjc)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment to provision the bucket in. Defaults to the production environment.
Clear enough to supply this argument.
staged
Stage the bucket in the environment's pending changes instead of provisioning it live. It becomes real only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"region",
"environment",
"staged"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string"
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the bucket was staged instead of applied. The bucket exists but is not provisioned until the staged changes are committed with accept-deploy."
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-bucket",
"description": "Create an S3-compatible object storage bucket in a project and provision it in an environment. Default region is sjc. Pass staged: true to stage the bucket in the environment's pending changes instead of provisioning it live — it then only becomes real when the staged changes are committed with accept-deploy.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId"
],
"properties": {
"name": {
"type": "string",
"description": "Name for the bucket. If omitted, a name is generated."
},
"region": {
"enum": [
"sjc",
"iad",
"ams",
"sin"
],
"type": "string",
"description": "Region to provision the bucket in (default: sjc)"
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the bucket in the environment's pending changes instead of provisioning it live. It becomes real only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"environmentId": {
"type": "string",
"description": "Environment to provision the bucket in. Defaults to the production environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"region",
"environment",
"staged"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string"
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the bucket was staged instead of applied. The bucket exists but is not provisioned until the staged changes are committed with accept-deploy."
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create bucket",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Rename a bucket. The name is project-wide (not per environment) and takes effect immediately. Reference variables address the bucket by name (${{BucketName.ACCESS_KEY_ID}} and so on), so after a rename update any service variables that reference the old name and redeploy those services. The S3 bucket name and credentials do not change.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID the bucket belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
bucketId
The bucket ID to rename
Explain the meaning of this value, not just its name.
name
New name for the bucket
Explain the meaning of this value, not just its name.
{
"name": "update-bucket",
"description": "Rename a bucket. The name is project-wide (not per environment) and takes effect immediately. Reference variables address the bucket by name (${{BucketName.ACCESS_KEY_ID}} and so on), so after a rename update any service variables that reference the old name and redeploy those services. The S3 bucket name and credentials do not change.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"bucketId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "New name for the bucket"
},
"bucketId": {
"type": "string",
"description": "The bucket ID to rename"
},
"projectId": {
"type": "string",
"description": "The project ID the bucket belongs to"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"previousName"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"previousName": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update bucket",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Permanently delete an object storage bucket and its contents. By default it is removed from every environment it is provisioned in; pass an environmentId to remove it from that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. Deleting from every environment is irreversible.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID the bucket belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
bucketId
The bucket ID to delete
Clear enough to supply this argument.
environmentId
Environment to remove the bucket from. If omitted, it is removed from every environment it is provisioned in. Required when staged is true.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environmentIds",
"staged"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"environmentIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Environments the bucket was removed from, or — when staged — the single environment the removal is staged in"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-bucket",
"description": "Permanently delete an object storage bucket and its contents. By default it is removed from every environment it is provisioned in; pass an environmentId to remove it from that one environment only. Pass staged: true to stage the removal in one environment instead of applying it live. Deleting from every environment is irreversible.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"bucketId"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"bucketId": {
"type": "string",
"description": "The bucket ID to delete"
},
"projectId": {
"type": "string",
"description": "The project ID the bucket belongs to"
},
"environmentId": {
"type": "string",
"description": "Environment to remove the bucket from. If omitted, it is removed from every environment it is provisioned in. Required when staged is true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environmentIds",
"staged"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"environmentIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Environments the bucket was removed from, or — when staged — the single environment the removal is staged in"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete bucket",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get the S3-compatible connection details for a bucket in an environment: endpoint, bucket name, region, URL style, access key and secret. With a Railway session or API token the access key and secret are returned in plaintext; connected OAuth apps receive the connection details only. Services in the same project should normally not copy these values but reference them as variables (${{BucketName.ENDPOINT}}, ${{BucketName.BUCKET}}, ${{BucketName.REGION}}, ${{BucketName.ACCESS_KEY_ID}}, ${{BucketName.SECRET_ACCESS_KEY}}), which also survive a credential reset. To rotate the credentials use reset-bucket-credentials. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID the bucket belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
bucketId
The bucket ID
Explain the meaning of this value, not just its name.
environmentId
Environment the bucket is provisioned in. Defaults to the production environment.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environment",
"endpoint",
"bucketName",
"region",
"urlStyle",
"credentialsCreatedAt",
"valuesRedacted"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string",
"description": "Region to pass to the S3 client"
},
"endpoint": {
"type": "string",
"description": "S3-compatible API endpoint"
},
"urlStyle": {
"enum": [
"path",
"virtual-host"
],
"type": "string",
"description": "Addressing style the endpoint expects"
},
"bucketName": {
"type": "string",
"description": "The bucket name to use against the S3 API (not the Railway name)"
},
"accessKeyId": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"valuesRedacted": {
"type": "boolean",
"description": "True when the access key and secret were withheld and only the connection details are returned"
},
"secretAccessKey": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"credentialsCreatedAt": {
"type": "string",
"description": "When the current access key was issued (ISO 8601)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-bucket-credentials",
"description": "Get the S3-compatible connection details for a bucket in an environment: endpoint, bucket name, region, URL style, access key and secret. With a Railway session or API token the access key and secret are returned in plaintext; connected OAuth apps receive the connection details only. Services in the same project should normally not copy these values but reference them as variables (${{BucketName.ENDPOINT}}, ${{BucketName.BUCKET}}, ${{BucketName.REGION}}, ${{BucketName.ACCESS_KEY_ID}}, ${{BucketName.SECRET_ACCESS_KEY}}), which also survive a credential reset. To rotate the credentials use reset-bucket-credentials. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"bucketId"
],
"properties": {
"bucketId": {
"type": "string",
"description": "The bucket ID"
},
"projectId": {
"type": "string",
"description": "The project ID the bucket belongs to"
},
"environmentId": {
"type": "string",
"description": "Environment the bucket is provisioned in. Defaults to the production environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environment",
"endpoint",
"bucketName",
"region",
"urlStyle",
"credentialsCreatedAt",
"valuesRedacted"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string",
"description": "Region to pass to the S3 client"
},
"endpoint": {
"type": "string",
"description": "S3-compatible API endpoint"
},
"urlStyle": {
"enum": [
"path",
"virtual-host"
],
"type": "string",
"description": "Addressing style the endpoint expects"
},
"bucketName": {
"type": "string",
"description": "The bucket name to use against the S3 API (not the Railway name)"
},
"accessKeyId": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"valuesRedacted": {
"type": "boolean",
"description": "True when the access key and secret were withheld and only the connection details are returned"
},
"secretAccessKey": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"credentialsCreatedAt": {
"type": "string",
"description": "When the current access key was issued (ISO 8601)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get bucket credentials",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Regenerate the S3-compatible credentials for a bucket in an environment and return the new ones. The current access key stops working immediately; bucket data is not affected. Every client using the old key needs the new values, and services that reference the bucket through variables keep the old key until redeployed — the result lists them so you can follow up with redeploy. With a Railway session or API token the new access key and secret are returned in plaintext; connected OAuth apps receive the connection details only. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID the bucket belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
bucketId
The bucket ID
Explain the meaning of this value, not just its name.
environmentId
Environment whose bucket credentials to reset. Defaults to the production environment.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environment",
"endpoint",
"bucketName",
"region",
"urlStyle",
"credentialsCreatedAt",
"valuesRedacted",
"dependentServices"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string",
"description": "Region to pass to the S3 client"
},
"endpoint": {
"type": "string",
"description": "S3-compatible API endpoint"
},
"urlStyle": {
"enum": [
"path",
"virtual-host"
],
"type": "string",
"description": "Addressing style the endpoint expects"
},
"bucketName": {
"type": "string",
"description": "The bucket name to use against the S3 API (not the Railway name)"
},
"accessKeyId": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"valuesRedacted": {
"type": "boolean",
"description": "True when the access key and secret were withheld and only the connection details are returned"
},
"secretAccessKey": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"dependentServices": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Services in this environment whose variables reference this bucket. They keep the old credentials until redeployed."
},
"credentialsCreatedAt": {
"type": "string",
"description": "When the current access key was issued (ISO 8601)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reset-bucket-credentials",
"description": "Regenerate the S3-compatible credentials for a bucket in an environment and return the new ones. The current access key stops working immediately; bucket data is not affected. Every client using the old key needs the new values, and services that reference the bucket through variables keep the old key until redeployed — the result lists them so you can follow up with redeploy. With a Railway session or API token the new access key and secret are returned in plaintext; connected OAuth apps receive the connection details only. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"bucketId"
],
"properties": {
"bucketId": {
"type": "string",
"description": "The bucket ID"
},
"projectId": {
"type": "string",
"description": "The project ID the bucket belongs to"
},
"environmentId": {
"type": "string",
"description": "Environment whose bucket credentials to reset. Defaults to the production environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bucket",
"environment",
"endpoint",
"bucketName",
"region",
"urlStyle",
"credentialsCreatedAt",
"valuesRedacted",
"dependentServices"
],
"properties": {
"bucket": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"region": {
"type": "string",
"description": "Region to pass to the S3 client"
},
"endpoint": {
"type": "string",
"description": "S3-compatible API endpoint"
},
"urlStyle": {
"enum": [
"path",
"virtual-host"
],
"type": "string",
"description": "Addressing style the endpoint expects"
},
"bucketName": {
"type": "string",
"description": "The bucket name to use against the S3 API (not the Railway name)"
},
"accessKeyId": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"valuesRedacted": {
"type": "boolean",
"description": "True when the access key and secret were withheld and only the connection details are returned"
},
"secretAccessKey": {
"type": "string",
"description": "Omitted for OAuth-authenticated clients"
},
"dependentServices": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Services in this environment whose variables reference this bucket. They keep the old credentials until redeployed."
},
"credentialsCreatedAt": {
"type": "string",
"description": "When the current access key was issued (ISO 8601)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Reset bucket credentials",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
List all domains (Railway-generated service domains and custom domains) for a service in an environment. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs44/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Get detailed status for one domain on a service, by hostname, URL, or domain ID: required DNS records and whether they currently match, ownership verification, certificate status, and any certificate error. Use list-domains first if you do not know which domains exist. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs56/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
domain
Hostname, full URL, or domain ID. For example api.example.com, https://api.example.com, or the id from list-domains.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Expose a service publicly. Without `domain`, generates a Railway *.up.railway.app service domain (if the service already has domains, they are returned instead of creating another). With `domain`, attaches a custom domain you own and returns the DNS records the user must create for it to verify. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs60/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
domain
A custom domain you own (e.g. app.example.com). Omit to generate a Railway domain.
Clear enough to supply this argument.
targetPort
Container port the domain routes to. Usually only needed when the service listens on multiple ports.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"domainType",
"domain",
"dnsRecords",
"certificateStatus",
"existingDomains"
],
"properties": {
"domain": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"created": {
"type": "boolean",
"description": "Whether a domain was created (false when existing domains were returned instead)"
},
"dnsRecords": {
"type": "array",
"items": {
"type": "object",
"required": [
"hostLabel",
"fqdn",
"recordType",
"purpose",
"requiredValue",
"currentValue",
"status"
],
"properties": {
"fqdn": {
"type": "string"
},
"status": {
"type": "string",
"description": "DNS_RECORD_STATUS_UNSPECIFIED means this lookup did not check the record; Railway still checks ownership records in the background."
},
"purpose": {
"type": "string",
"description": "DNS_RECORD_PURPOSE_TRAFFIC_ROUTE points the domain at Railway, DNS_RECORD_PURPOSE_ACME_DNS01_CHALLENGE lets Railway issue a wildcard certificate, and DNS_RECORD_PURPOSE_OWNERSHIP_VERIFICATION proves the user controls the domain."
},
"hostLabel": {
"type": "string"
},
"recordType": {
"type": "string"
},
"currentValue": {
"type": "string",
"description": "Empty when the record is unset or has not been checked."
},
"requiredValue": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "For custom domains: the DNS records the user must create, with required vs current values"
},
"domainType": {
"anyOf": [
{
"enum": [
"service",
"custom"
],
"type": "string"
},
{
"type": "null"
}
]
},
"existingDomains": {
"type": "array",
"items": {
"type": "string"
}
},
"certificateStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "generate-domain",
"description": "Expose a service publicly. Without `domain`, generates a Railway *.up.railway.app service domain (if the service already has domains, they are returned instead of creating another). With `domain`, attaches a custom domain you own and returns the DNS records the user must create for it to verify. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"domain": {
"type": "string",
"description": "A custom domain you own (e.g. app.example.com). Omit to generate a Railway domain."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"targetPort": {
"type": "integer",
"maximum": 65535,
"minimum": 1,
"description": "Container port the domain routes to. Usually only needed when the service listens on multiple ports."
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"domainType",
"domain",
"dnsRecords",
"certificateStatus",
"existingDomains"
],
"properties": {
"domain": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"created": {
"type": "boolean",
"description": "Whether a domain was created (false when existing domains were returned instead)"
},
"dnsRecords": {
"type": "array",
"items": {
"type": "object",
"required": [
"hostLabel",
"fqdn",
"recordType",
"purpose",
"requiredValue",
"currentValue",
"status"
],
"properties": {
"fqdn": {
"type": "string"
},
"status": {
"type": "string",
"description": "DNS_RECORD_STATUS_UNSPECIFIED means this lookup did not check the record; Railway still checks ownership records in the background."
},
"purpose": {
"type": "string",
"description": "DNS_RECORD_PURPOSE_TRAFFIC_ROUTE points the domain at Railway, DNS_RECORD_PURPOSE_ACME_DNS01_CHALLENGE lets Railway issue a wildcard certificate, and DNS_RECORD_PURPOSE_OWNERSHIP_VERIFICATION proves the user controls the domain."
},
"hostLabel": {
"type": "string"
},
"recordType": {
"type": "string"
},
"currentValue": {
"type": "string",
"description": "Empty when the record is unset or has not been checked."
},
"requiredValue": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "For custom domains: the DNS records the user must create, with required vs current values"
},
"domainType": {
"anyOf": [
{
"enum": [
"service",
"custom"
],
"type": "string"
},
{
"type": "null"
}
]
},
"existingDomains": {
"type": "array",
"items": {
"type": "string"
}
},
"certificateStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate domain",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Repoint or rename an existing domain on a service. targetPort changes which container port the domain routes to (for a service listening on several ports). subdomain renames a Railway-generated service domain to <subdomain>.up.railway.app; custom domains cannot be renamed — delete the old one and add the new one with generate-domain. The change applies live. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
domain
Hostname, full URL, or domain ID of the domain to change. For example api.example.com or the id from list-domains.
Clear enough to supply this argument.
targetPort
Container port the domain should route to.
Clear enough to supply this argument.
subdomain
New label for a Railway service domain: `my-api` renames it to my-api.up.railway.app. Service domains only.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Remove a domain from a service: a Railway-generated *.up.railway.app service domain or a custom domain. Requests to that hostname stop being routed to the service as soon as the removal applies. Pass staged: true to stage the removal of a service domain in the environment's pending changes instead of applying it live. Custom domain removal always applies live. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs66/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
domain
Hostname, full URL, or domain ID. For example api.example.com, https://api.example.com, or the id from list-domains.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"domain",
"kind",
"staged"
],
"properties": {
"kind": {
"enum": [
"service",
"custom"
],
"type": "string"
},
"domain": {
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"description": "The domain that was removed",
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-domain",
"description": "Remove a domain from a service: a Railway-generated *.up.railway.app service domain or a custom domain. Requests to that hostname stop being routed to the service as soon as the removal applies. Pass staged: true to stage the removal of a service domain in the environment's pending changes instead of applying it live. Custom domain removal always applies live. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Hostname, full URL, or domain ID. For example api.example.com, https://api.example.com, or the id from list-domains."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"domain",
"kind",
"staged"
],
"properties": {
"kind": {
"enum": [
"service",
"custom"
],
"type": "string"
},
"domain": {
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"description": "The domain that was removed",
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete domain",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Request a new TLS certificate for a custom domain whose issuance failed. Use domain-status first: it reports the certificate error and whether a retry can help (certificate.retryable). A retry cannot succeed until the domain's DNS records point at Railway. Railway-generated service domains have their certificates managed by Railway and need no retry. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs57/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
domain
Hostname, full URL, or domain ID of the custom domain. For example api.example.com or the id from list-domains.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"domain",
"requested",
"certificateStatus"
],
"properties": {
"domain": {
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"requested": {
"type": "boolean",
"description": "Whether a new certificate issuance was requested. False when the current certificate is already valid."
},
"certificateStatus": {
"type": "string",
"description": "The certificate status before this call"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "retry-domain-certificate",
"description": "Request a new TLS certificate for a custom domain whose issuance failed. Use domain-status first: it reports the certificate error and whether a retry can help (certificate.retryable). A retry cannot succeed until the domain's DNS records point at Railway. Railway-generated service domains have their certificates managed by Railway and need no retry. If environmentId is omitted, the production environment is used.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Hostname, full URL, or domain ID of the custom domain. For example api.example.com or the id from list-domains."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to `production` if present, otherwise the project's oldest environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"domain",
"requested",
"certificateStatus"
],
"properties": {
"domain": {
"type": "object",
"required": [
"id",
"domain",
"targetPort"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"targetPort": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"requested": {
"type": "boolean",
"description": "Whether a new certificate issuance was requested. False when the current certificate is already valid."
},
"certificateStatus": {
"type": "string",
"description": "The certificate status before this call"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Retry domain certificate",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Search the Railway documentation (docs.railway.com) for features, configuration, guides, and tutorials. Returns matching sections with URLs — use fetch-docs to read a full page.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
query
The search query (e.g. 'environment variables', 'deploy docker', 'postgres connection')
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Fetch the full markdown content of a Railway documentation page by URL or slug (e.g. 'https://docs.railway.com/quick-start' or 'reference/variables'). Use search-docs first to find the right page.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
url
Documentation page URL or slug from search-docs results
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Search the Railway template marketplace by name, description or keyword — databases (postgres, mysql, mongo, redis, clickhouse), their high-availability variants, and application templates. Returns published templates ranked by relevance. Use describe-template to read a result's inputs before deploying it with deploy-template.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
What to search for, e.g. 'postgres', 'high availability redis', 'n8n'.
Clear enough to supply this argument.
limit
Maximum templates to return. Defaults to 5.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
verifiedOnly
Only return templates Railway has verified. Prefer this for databases the user will run in production.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read one Railway template: its name, description, README, the services it creates, every env-var input it takes (which are required and which are optional), and — for clustered database templates like postgres-ha — the HA topology counts deploy-template can size. Call this before deploy-template so required inputs are collected from the user rather than guessed.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
code
The template's code (the slug in its railway.com/template/<code> URL), e.g. 'postgres', 'postgres-ha', 'redis'.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Deploy a Railway template into a project — a database (postgres, mysql, redis, mongo), a clustered high-availability database, or an application template. Creates every service the template declares, wired together, and deploys them. Pass staged: true to stage them for the user to review instead.
Call describe-template first: it lists the env-var inputs the template requires and the HA counts it accepts. This tool does not take secrets: never ask the user for, or pass, a password, API key, token or other credential. Use `variables` only for non-secret settings such as names, regions or public URLs. Omit optional inputs to keep the template's defaults — database passwords and other secrets the template declares as generated are created by Railway at deploy time. If a template requires a secret the user must supply, do not deploy it here: give the user the template's dashboard link (in the error this tool returns) so they enter it there.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
code
The template's code (the slug in its railway.com/template/<code> URL), e.g. 'postgres', 'postgres-ha', 'redis'.
Clear enough to supply this argument.
projectId
The project to deploy the template into
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
Environment to deploy into. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
variables
Values for the template's non-secret env-var inputs, keyed by variable name as reported by describe-template. Never pass passwords, API keys, tokens or other credentials here. A name several of the template's services declare gets the same value on each. Unknown names are rejected rather than ignored.
Clear enough to supply this argument.
replicaCount
For a clustered database template: how many replicas to deploy alongside the primary (2 replicas = 3 data nodes). Only counts describe-template lists under `allowedCounts` are accepted. Omit to keep the template's authored topology.
Clear enough to supply this argument.
coordinatorCount
For a clustered database template: how many coordinator nodes (etcd/Sentinel-style consensus members). Must be odd and at least 3. Omit to keep the template's authored count.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
proxyCount
For a clustered database template: how many instances of the proxy/load-balancer tier (e.g. HAProxy). Omit to keep the template's authored count.
Clear enough to supply this argument.
staged
Stage the template's services in the environment's pending changes instead of deploying them. Nothing is provisioned until the staged changes are committed with accept-deploy (or applied in the dashboard).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template",
"project",
"environment",
"services",
"workflowId",
"staged",
"variablesApplied",
"highAvailability"
],
"properties": {
"staged": {
"type": "boolean",
"description": "True when the services were staged rather than deployed. Commit them with accept-deploy (or let the user apply them in the dashboard)."
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"services": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the services this deploy creates"
},
"template": {
"type": "object",
"required": [
"code",
"name"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"workflowId": {
"type": "string",
"description": "The deploy runs asynchronously under this workflow. Follow it with list-services / get-status, or get-staged-changes when staged."
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"highAvailability": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
{
"type": "null"
}
],
"description": "The member counts applied per role, when any were requested"
},
"variablesApplied": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the variables set from the `variables` param"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "deploy-template",
"description": "Deploy a Railway template into a project — a database (postgres, mysql, redis, mongo), a clustered high-availability database, or an application template. Creates every service the template declares, wired together, and deploys them. Pass staged: true to stage them for the user to review instead.\n\nCall describe-template first: it lists the env-var inputs the template requires and the HA counts it accepts. This tool does not take secrets: never ask the user for, or pass, a password, API key, token or other credential. Use `variables` only for non-secret settings such as names, regions or public URLs. Omit optional inputs to keep the template's defaults — database passwords and other secrets the template declares as generated are created by Railway at deploy time. If a template requires a secret the user must supply, do not deploy it here: give the user the template's dashboard link (in the error this tool returns) so they enter it there.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code",
"projectId"
],
"properties": {
"code": {
"type": "string",
"description": "The template's code (the slug in its railway.com/template/<code> URL), e.g. 'postgres', 'postgres-ha', 'redis'."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the template's services in the environment's pending changes instead of deploying them. Nothing is provisioned until the staged changes are committed with accept-deploy (or applied in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project to deploy the template into"
},
"variables": {
"type": "object",
"description": "Values for the template's non-secret env-var inputs, keyed by variable name as reported by describe-template. Never pass passwords, API keys, tokens or other credentials here. A name several of the template's services declare gets the same value on each. Unknown names are rejected rather than ignored.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"proxyCount": {
"type": "integer",
"maximum": 9007199254740991,
"description": "For a clustered database template: how many instances of the proxy/load-balancer tier (e.g. HAProxy). Omit to keep the template's authored count.",
"exclusiveMinimum": 0
},
"replicaCount": {
"type": "integer",
"maximum": 9007199254740991,
"description": "For a clustered database template: how many replicas to deploy alongside the primary (2 replicas = 3 data nodes). Only counts describe-template lists under `allowedCounts` are accepted. Omit to keep the template's authored topology.",
"exclusiveMinimum": 0
},
"environmentId": {
"type": "string",
"description": "Environment to deploy into. Defaults to `production` if present, otherwise the project's oldest environment."
},
"coordinatorCount": {
"type": "integer",
"maximum": 9007199254740991,
"description": "For a clustered database template: how many coordinator nodes (etcd/Sentinel-style consensus members). Must be odd and at least 3. Omit to keep the template's authored count.",
"exclusiveMinimum": 0
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template",
"project",
"environment",
"services",
"workflowId",
"staged",
"variablesApplied",
"highAvailability"
],
"properties": {
"staged": {
"type": "boolean",
"description": "True when the services were staged rather than deployed. Commit them with accept-deploy (or let the user apply them in the dashboard)."
},
"project": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"services": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the services this deploy creates"
},
"template": {
"type": "object",
"required": [
"code",
"name"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"workflowId": {
"type": "string",
"description": "The deploy runs asynchronously under this workflow. Follow it with list-services / get-status, or get-staged-changes when staged."
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"highAvailability": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
{
"type": "null"
}
],
"description": "The member counts applied per role, when any were requested"
},
"variablesApplied": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the variables set from the `variables` param"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Deploy template",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
List Railway feature flags (Signals) for a project and optionally the parent workspace. Project flags are editable with admin access; workspace flags are read-only from project context.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includeWorkspace
Include workspace-scoped flags inherited by the project (default true)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Create a project-scoped feature flag or update its default value, optionally replacing its targeting rules. Use list-feature-flags and get-feature-flag to inspect existing flags first.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs86/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
name
Feature flag name (letters, numbers, dots, dashes, underscores)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Flag type (required when creating a new flag)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
defaultValue
Default value as text: "true"/"false", a raw string, a number, or JSON
Clear enough to supply this argument.
rules › items › id
Stable rule ID. Defaults to a hash of the flag name and expression, so re-sending the same rule updates it in place.
Clear enough to supply this argument.
rules › items › expression
Targeting expression in the CEL subset `railway flag set --when` accepts: `workspace_plan == "enterprise"`, `region in ["us-east", "eu-west"]`, `bucket(workspace_id) < 0.25` (percentage rollout), combined with `&&`, `||`, `!`. Raw JSON (a Radar clause or bucket compare) is also accepted.
Clear enough to supply this argument.
rules › items › value
Value served when the rule matches, as text in the flag's type (same format as defaultValue).
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List recent deployments for a Railway project, optionally filtered by environment, service, or status. Returns the most recent first, with who triggered each one, its regions, and whether it can be redeployed or rolled back.
The description explains the capability, when to use it, and what to expect.
Inputs60/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
Filter to a specific environment
Explain the meaning of this value, not just its name.
serviceId
Filter to a specific service
Explain the meaning of this value, not just its name.
status
Filter to deployments with this status (e.g. SUCCESS, FAILED, CRASHED, BUILDING, DEPLOYING)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max deployments to return (default 10, max 50)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Prefer describe-environment: it also lists services that exist only in the staged patch, unattached volumes, and each resource's staged state. Get the deployment status of a Railway project environment. Returns project + environment metadata, whether the environment has undeployed staged changes, the environment's buckets, and for each live service its latest deployment status, replica count, cron schedule, and attached volumes. Also includes `pendingWork`: the environment's pending (staged/applying) work that is not live yet — a staged patch or a commit still rolling out (poll until the operation leaves this list). If environmentId is omitted, the project's `production` environment is used when present, otherwise the oldest environment.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
Environment to report on. Defaults to `production` if present, otherwise the project's oldest environment.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Get logs from Railway — deploy (runtime), build, http (proxy request), network-flow (per-connection egress/ingress) and dns (name lookups) streams. Pass a deploymentId to read one deployment, or serviceId (+ optional environmentId) to read the service's logs across its recent deployments in that environment. Use `types` to choose which streams to return (default: ['deploy']).
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
deploymentId
A specific deployment ID. Omit it and pass serviceId to read the service's logs across its recent deployments.
Clear enough to supply this argument.
serviceId
Service ID. With no deploymentId, returns the service's logs across its deployments in the environment (build logs come from the latest deployment).
Clear enough to supply this argument.
environmentId
Environment ID to read logs from. Optional — when omitted with a serviceId, the project's production environment is used (or its oldest, if there is no production).
Clear enough to supply this argument.
types
Array of log stream names. Example: ["build", "deploy"] or ["http", "network-flow", "dns"]. Omit to fetch only deploy logs.
Clear enough to supply this argument.
limit
Max log entries per stream (default 100, max 500)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filter
Optional log filter expression (Loki-style, same syntax as the Railway dashboard). Applies to build and deploy streams; http, network-flow and dns take their own @field filters (e.g. @status:500, @direction:egress, @rcode:NXDOMAIN).
Clear enough to supply this argument.
startDate
ISO 8601 timestamp with an explicit timezone, at minute precision or finer. Example: "2026-07-27T14:30:00.000Z". Fractional seconds are optional.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endDate
ISO 8601 timestamp with an explicit timezone, at minute precision or finer. Example: "2026-07-27T15:30:00.000Z". Fractional seconds are optional; defaults to now.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
List distributed traces of an environment, newest first — one row per request that has at least one span matching the filter. Use it to find slow or failing requests across services, then call get-trace with a traceId for the spans. Defaults to the last hour. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
environmentId
Environment to read traces from. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
serviceId
Only traces with at least one span from this service. Omit for the whole environment.
Clear enough to supply this argument.
filter
Filter expression over spans, e.g. @status:error @component:edge @duration:>500 @http.route:/api/users. Built-in fields: trace, span, name, serviceName, service, deployment, replica, component, kind, status, duration (ms). Any other @key looks the key up in the span and resource attributes; free text matches the span name. Prefix a term with - to exclude it.
Clear enough to supply this argument.
startDate
Oldest span start to consider. ISO 8601 with an explicit timezone, e.g. "2026-07-27T14:30:00.000Z". Clamped to the project's log retention; defaults to one hour before endDate.
Clear enough to supply this argument.
endDate
Latest span start to consider. ISO 8601 with an explicit timezone, e.g. "2026-07-27T15:30:00.000Z". Defaults to now.
Clear enough to supply this argument.
limit
Max traces to return (default 100, max 500)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Get the spans of one distributed trace, as a tree from the edge down through every service that handled the request. Find trace IDs with list-traces. Only spans belonging to the environment are returned. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs50/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
environmentId
Environment the trace belongs to. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
traceId
W3C trace id, 32 hex characters
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxSpans
Max spans to return, oldest first (default 1000, max 2000)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Read the tracing settings of an environment's services: whether each is traced and its auto-instrumentation switch. Pass serviceId for one service, omit it for every service in the environment. Tracing is set per service and environment; if environmentId is omitted, the production environment is used. Change it with set-service-tracing; use list-traces to see whether spans are arriving.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
environmentId
The environment ID. Defaults to production.
Clear enough to supply this argument.
serviceId
One service to read. Omit for every service in the environment.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"services"
],
"properties": {
"services": {
"type": "array",
"items": {
"type": "object",
"required": [
"tracingEnabled",
"autoInstrumentationEnabled",
"autoInstrumentationActive",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"tracingEnabled": {
"type": "boolean",
"description": "Whether requests to the service are traced in this environment: the edge records a span per client-facing request and the next deploy provides the OpenTelemetry exporter variables"
},
"autoInstrumentationActive": {
"type": "boolean",
"description": "Whether auto-instrumentation is in effect. The switch only does anything while tracing is enabled."
},
"autoInstrumentationEnabled": {
"type": "boolean",
"description": "The service's auto-instrumentation switch: Railway instruments its processes with eBPF (OBI) for supported runtimes, no code changes"
}
},
"additionalProperties": false
},
"description": "The requested service, or every service in the environment when serviceId is omitted"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-tracing",
"description": "Read the tracing settings of an environment's services: whether each is traced and its auto-instrumentation switch. Pass serviceId for one service, omit it for every service in the environment. Tracing is set per service and environment; if environmentId is omitted, the production environment is used. Change it with set-service-tracing; use list-traces to see whether spans are arriving.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "One service to read. Omit for every service in the environment."
},
"environmentId": {
"type": "string",
"description": "The environment ID. Defaults to production."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"services"
],
"properties": {
"services": {
"type": "array",
"items": {
"type": "object",
"required": [
"tracingEnabled",
"autoInstrumentationEnabled",
"autoInstrumentationActive",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"tracingEnabled": {
"type": "boolean",
"description": "Whether requests to the service are traced in this environment: the edge records a span per client-facing request and the next deploy provides the OpenTelemetry exporter variables"
},
"autoInstrumentationActive": {
"type": "boolean",
"description": "Whether auto-instrumentation is in effect. The switch only does anything while tracing is enabled."
},
"autoInstrumentationEnabled": {
"type": "boolean",
"description": "The service's auto-instrumentation switch: Railway instruments its processes with eBPF (OBI) for supported runtimes, no code changes"
}
},
"additionalProperties": false
},
"description": "The requested service, or every service in the environment when serviceId is omitted"
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get tracing settings",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Report what one service's own instrumentation covers: the spans its app exported in the window, by span kind, by the remote system they name (database, cache, queue, RPC or HTTP client) and by the instrumentation library that emitted them. Use it after instrumenting a service to prove that its database queries and outgoing calls produce spans, not just its incoming requests. Defaults to the last hour. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs74/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service whose spans to summarise
Clear enough to supply this argument.
environmentId
Environment to read spans from. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
startDate
Oldest span start to consider. ISO 8601 with an explicit timezone, e.g. "2026-07-27T14:30:00.000Z". Clamped to the project's log retention; defaults to one hour before endDate.
Clear enough to supply this argument.
endDate
Latest span start to consider. ISO 8601 with an explicit timezone, e.g. "2026-07-27T15:30:00.000Z". Defaults to now.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Enable or disable tracing and auto-instrumentation for one service in one environment, each independently. tracingEnabled switches whether the edge traces requests to the service and whether its next deploy gets the OpenTelemetry exporter variables. autoInstrumentationEnabled switches eBPF (OBI) instrumentation of the service's processes, which only takes effect while tracing is enabled. No redeploy is needed for the edge or auto-instrumentation. If environmentId is omitted, the production environment is used. Read the current state with get-tracing.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
The environment ID. Defaults to production.
Clear enough to supply this argument.
tracingEnabled
Trace requests to this service in the environment. Omit to leave it alone.
Clear enough to supply this argument.
autoInstrumentationEnabled
Switch auto-instrumentation (eBPF/OBI) for this service in the environment. Omit to leave it alone.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"service",
"updatedFields"
],
"properties": {
"service": {
"type": "object",
"required": [
"tracingEnabled",
"autoInstrumentationEnabled",
"autoInstrumentationActive",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"tracingEnabled": {
"type": "boolean",
"description": "Whether requests to the service are traced in this environment: the edge records a span per client-facing request and the next deploy provides the OpenTelemetry exporter variables"
},
"autoInstrumentationActive": {
"type": "boolean",
"description": "Whether auto-instrumentation is in effect. The switch only does anything while tracing is enabled."
},
"autoInstrumentationEnabled": {
"type": "boolean",
"description": "The service's auto-instrumentation switch: Railway instruments its processes with eBPF (OBI) for supported runtimes, no code changes"
}
},
"description": "The service's state in the environment after the change",
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-service-tracing",
"description": "Enable or disable tracing and auto-instrumentation for one service in one environment, each independently. tracingEnabled switches whether the edge traces requests to the service and whether its next deploy gets the OpenTelemetry exporter variables. autoInstrumentationEnabled switches eBPF (OBI) instrumentation of the service's processes, which only takes effect while tracing is enabled. No redeploy is needed for the edge or auto-instrumentation. If environmentId is omitted, the production environment is used. Read the current state with get-tracing.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "The environment ID. Defaults to production."
},
"tracingEnabled": {
"type": "boolean",
"description": "Trace requests to this service in the environment. Omit to leave it alone."
},
"autoInstrumentationEnabled": {
"type": "boolean",
"description": "Switch auto-instrumentation (eBPF/OBI) for this service in the environment. Omit to leave it alone."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"environment",
"service",
"updatedFields"
],
"properties": {
"service": {
"type": "object",
"required": [
"tracingEnabled",
"autoInstrumentationEnabled",
"autoInstrumentationActive",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"tracingEnabled": {
"type": "boolean",
"description": "Whether requests to the service are traced in this environment: the edge records a span per client-facing request and the next deploy provides the OpenTelemetry exporter variables"
},
"autoInstrumentationActive": {
"type": "boolean",
"description": "Whether auto-instrumentation is in effect. The switch only does anything while tracing is enabled."
},
"autoInstrumentationEnabled": {
"type": "boolean",
"description": "The service's auto-instrumentation switch: Railway instruments its processes with eBPF (OBI) for supported runtimes, no code changes"
}
},
"description": "The service's state in the environment after the change",
"additionalProperties": false
},
"environment": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
},
"updatedFields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set service tracing",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Get HTTP request counts for a service, bucketed over time and split by response status class (2xx/3xx/4xx/5xx). Use this for traffic volume and the mix of successful versus failing responses. Defaults to the last hour. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
hoursBack
Time window in hours, up to 168 (7 days). Defaults to 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxDataPoints
Target number of buckets across the window. Defaults to 30, max 60 — the same cap the chat agent uses. Buckets are never finer than one minute, so a short window returns fewer than requested.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
Restrict to one HTTP method, e.g. GET.
Clear enough to supply this argument.
path
Restrict to one request path.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Get the HTTP error rate for a service over time — the share of requests answered with a 5xx. Use this for reliability and to locate error spikes. 4xx responses are reported separately and are not counted in the rate, since a 404 or a rejected payload is usually the caller's doing. Defaults to the last hour. If environmentId is omitted, the production environment is used.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
hoursBack
Time window in hours, up to 168 (7 days). Defaults to 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxDataPoints
Target number of buckets across the window. Defaults to 30, max 60 — the same cap the chat agent uses. Buckets are never finer than one minute, so a short window returns fewer than requested.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
Restrict to one HTTP method, e.g. GET.
Clear enough to supply this argument.
path
Restrict to one request path.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Get HTTP latency percentiles (p50, p90, p95, p99) for a service, bucketed over time, in milliseconds. Use this for performance and to find slow requests. Defaults to the last hour. If environmentId is omitted, the production environment is used.
Resolve contradictions between the description, input schema, and annotations.
Inputs63/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to `production` if present, otherwise the project's oldest environment.
Resolve the mismatch between this description and its schema constraints.
hoursBack
Time window in hours, up to 168 (7 days). Defaults to 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxDataPoints
Target number of buckets across the window. Defaults to 30, max 60 — the same cap the chat agent uses. Buckets are never finer than one minute, so a short window returns fewer than requested.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
Restrict to one HTTP method, e.g. GET.
Clear enough to supply this argument.
path
Restrict to one request path.
Clear enough to supply this argument.
statusCode
Restrict to one exact response status code, e.g. 200.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Re-run the most recent deployment of a service in a given environment, reusing that deployment's existing build. Pass deploymentId to redeploy an earlier deployment's build instead (list-deployments has the ids). Only works on a service that has already deployed in that environment — check with list-deployments if you are unsure. This does NOT give a service its first deployment: if it has never deployed, nothing here can deploy it — use the Railway CLI (`railway up --project <id> --environment <id> --service <id>`), or attach a GitHub repo to the service in the dashboard. create-deployment would build a separate new service from a GitHub repo rather than deploying this one.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
serviceId
The service ID to redeploy
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
The environment ID to redeploy in
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
deploymentId
Redeploy this deployment's build instead of the service's latest one. Must belong to the given service and environment.
{
"name": "redeploy",
"description": "Re-run the most recent deployment of a service in a given environment, reusing that deployment's existing build. Pass deploymentId to redeploy an earlier deployment's build instead (list-deployments has the ids). Only works on a service that has already deployed in that environment — check with list-deployments if you are unsure. This does NOT give a service its first deployment: if it has never deployed, nothing here can deploy it — use the Railway CLI (`railway up --project <id> --environment <id> --service <id>`), or attach a GitHub repo to the service in the dashboard. create-deployment would build a separate new service from a GitHub repo rather than deploying this one.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"environmentId"
],
"properties": {
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID to redeploy"
},
"deploymentId": {
"type": "string",
"description": "Redeploy this deployment's build instead of the service's latest one. Must belong to the given service and environment."
},
"environmentId": {
"type": "string",
"description": "The environment ID to redeploy in"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deployment"
],
"properties": {
"deployment": {
"type": "object",
"required": [
"id",
"status",
"serviceId",
"environmentId"
],
"properties": {
"id": {
"type": "string",
"description": "New deployment ID"
},
"status": {
"type": "string",
"description": "Initial Railway deployment status"
},
"serviceId": {
"type": "string",
"description": "Redeployed service ID"
},
"environmentId": {
"type": "string",
"description": "Environment receiving the redeployment"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Redeploy service",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Restart a service's running deployment in place — the containers restart without rebuilding the image, and no new deployment is created (use redeploy for a fresh build copy). Restarting causes brief downtime; do NOT restart database services (Postgres, MySQL, Redis, MongoDB) or services with attached volumes unless the user explicitly asked, as it can interrupt in-flight queries and transactions.
The description explains the capability, when to use it, and what to expect.
Inputs74/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
serviceId
The service ID to restart
Explain the meaning of this value, not just its name.
environmentId
Environment whose deployment to restart. Defaults to the production environment.
Clear enough to supply this argument.
deploymentId
Specific deployment to restart. If omitted, the latest running or crashed deployment is restarted.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get the AI-generated diagnosis for a failed deployment: root cause category, analysis, and suggested fixes, along with deployment context (service config, source repo, branch, commit, PR, failure stage and error). Diagnoses run automatically when a deployment fails — if one isn't available yet, fall back to get-logs to inspect the failure directly.
The description explains the capability, when to use it, and what to expect.
Inputs64/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Health overview of every service in an environment in one call: current LIVE (settled) deployment state, replica status, recent failures, unresolved warnings/criticals, and cron execution results. Also includes `pendingWork`: the environment's pending (staged/applying) work that is not live yet — a staged patch or a commit still rolling out (poll until the operation leaves this list). By default only services with issues are returned — pass includeSuccessful to see everything. For error details, follow up with get-logs on the deployment IDs returned here.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
environmentId
Environment to check. Defaults to the production environment.
Clear enough to supply this argument.
serviceFilter
Minimatch pattern to filter services by name — NOT fuzzy; wrap in wildcards for substring matching, e.g. "*api*". Omit for all services.
Clear enough to supply this argument.
hoursBack
How many hours back to count failures (default 8)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum services to return (default 10)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includeSuccessful
Include healthy services too (default false: only services with issues)
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List the TCP proxies exposing a service over the public internet on a raw TCP port (e.g. a database's public endpoint). Returns the public endpoint (host:port) and the application port each proxy forwards to.
The description explains the capability, when to use it, and what to expect.
Inputs58/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to the production environment.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Expose a service on the public internet over a raw TCP port (e.g. make a database reachable externally). Creates a TCP proxy forwarding a public endpoint to the given application port, applied through the environment config so the service redeploys with it active. Pass staged: true to stage the proxy in the environment's pending changes instead — it is only provisioned, and only gets a public endpoint, once the staged changes are committed with accept-deploy. A service can have at most one TCP proxy.
The description explains the capability, when to use it, and what to expect.
Inputs77/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to the production environment.
Clear enough to supply this argument.
applicationPort
The port the service listens on, e.g. 5432 for Postgres
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"proxy",
"committed",
"staged"
],
"properties": {
"proxy": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"endpoint",
"domain",
"proxyPort",
"applicationPort",
"syncStatus"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"endpoint": {
"type": "string",
"description": "Public endpoint to connect to, host:port"
},
"proxyPort": {
"type": "number"
},
"syncStatus": {
"type": "string"
},
"applicationPort": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"committed": {
"type": "boolean"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-tcp-proxy",
"description": "Expose a service on the public internet over a raw TCP port (e.g. make a database reachable externally). Creates a TCP proxy forwarding a public endpoint to the given application port, applied through the environment config so the service redeploys with it active. Pass staged: true to stage the proxy in the environment's pending changes instead — it is only provisioned, and only gets a public endpoint, once the staged changes are committed with accept-deploy. A service can have at most one TCP proxy.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"applicationPort"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to the production environment."
},
"applicationPort": {
"type": "integer",
"maximum": 65535,
"minimum": 1,
"description": "The port the service listens on, e.g. 5432 for Postgres"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"proxy",
"committed",
"staged"
],
"properties": {
"proxy": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"endpoint",
"domain",
"proxyPort",
"applicationPort",
"syncStatus"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"endpoint": {
"type": "string",
"description": "Public endpoint to connect to, host:port"
},
"proxyPort": {
"type": "number"
},
"syncStatus": {
"type": "string"
},
"applicationPort": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"committed": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create TCP proxy",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Remove a service's TCP proxy, taking its public endpoint offline. Anything connecting through that endpoint (e.g. external database clients) loses access. Pass staged: true to stage the removal in the environment's pending changes instead — that is also how a proxy that is itself only staged gets dropped again.
The description explains the capability, when to use it, and what to expect.
Inputs73/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID
Explain the meaning of this value, not just its name.
environmentId
Environment ID. Defaults to the production environment.
Clear enough to supply this argument.
applicationPort
The application port of the proxy to remove
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"proxy",
"staged"
],
"properties": {
"proxy": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"endpoint",
"domain",
"proxyPort",
"applicationPort",
"syncStatus"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"endpoint": {
"type": "string",
"description": "Public endpoint to connect to, host:port"
},
"proxyPort": {
"type": "number"
},
"syncStatus": {
"type": "string"
},
"applicationPort": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The proxy that was removed, or null when it was only staged and so never had a public endpoint."
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-tcp-proxy",
"description": "Remove a service's TCP proxy, taking its public endpoint offline. Anything connecting through that endpoint (e.g. external database clients) loses access. Pass staged: true to stage the removal in the environment's pending changes instead — that is also how a proxy that is itself only staged gets dropped again.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId",
"applicationPort"
],
"properties": {
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID"
},
"environmentId": {
"type": "string",
"description": "Environment ID. Defaults to the production environment."
},
"applicationPort": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The application port of the proxy to remove"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"proxy",
"staged"
],
"properties": {
"proxy": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"endpoint",
"domain",
"proxyPort",
"applicationPort",
"syncStatus"
],
"properties": {
"id": {
"type": "string"
},
"domain": {
"type": "string"
},
"endpoint": {
"type": "string",
"description": "Public endpoint to connect to, host:port"
},
"proxyPort": {
"type": "number"
},
"syncStatus": {
"type": "string"
},
"applicationPort": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The proxy that was removed, or null when it was only staged and so never had a public endpoint."
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete TCP proxy",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Attach a source to an existing service: a GitHub repository (deploys on push, builds immediately) or a Docker image. This is how a service that has never deployed gets its first deployment, and how an existing service's source is switched. Provide exactly one of repo or image. Pass commitSha with repo to pin the service to one commit instead of following the branch. Images must be public: credentials for a private registry are not accepted here — the user sets them on the service in the Railway dashboard. By default it applies to the service in all environments; pass staged: true with an environmentId to stage the source in that one environment's pending changes instead, in which case nothing builds until the staged changes are committed with accept-deploy.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
projectId
The project ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceId
The service ID to attach the source to
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
repo
GitHub repository as owner/repo, e.g. railwayapp/starters. The user's GitHub account must have access to it.
Clear enough to supply this argument.
branch
Branch to deploy from. Only valid with repo; defaults to the repository's default branch.
Clear enough to supply this argument.
commitSha
Commit SHA to pin the service to. Only valid with repo. The service deploys exactly this commit and pushes to the branch no longer deploy it, until the source is connected again without commitSha.
Clear enough to supply this argument.
image
Docker image to deploy, e.g. ghcr.io/org/app:latest
Clear enough to supply this argument.
environmentId
Environment to scope a staged source change to. Only valid with staged: true, and required by it — a live connect always applies to every environment.
Clear enough to supply this argument.
staged
Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard).
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"source",
"staged"
],
"properties": {
"source": {
"type": "object",
"required": [
"repo",
"branch",
"commitSha",
"image"
],
"properties": {
"repo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"branch": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"commitSha": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The commit the service is pinned to, if any"
}
},
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "connect-service-source",
"description": "Attach a source to an existing service: a GitHub repository (deploys on push, builds immediately) or a Docker image. This is how a service that has never deployed gets its first deployment, and how an existing service's source is switched. Provide exactly one of repo or image. Pass commitSha with repo to pin the service to one commit instead of following the branch. Images must be public: credentials for a private registry are not accepted here — the user sets them on the service in the Railway dashboard. By default it applies to the service in all environments; pass staged: true with an environmentId to stage the source in that one environment's pending changes instead, in which case nothing builds until the staged changes are committed with accept-deploy.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"serviceId"
],
"properties": {
"repo": {
"type": "string",
"description": "GitHub repository as owner/repo, e.g. railwayapp/starters. The user's GitHub account must have access to it."
},
"image": {
"type": "string",
"description": "Docker image to deploy, e.g. ghcr.io/org/app:latest"
},
"branch": {
"type": "string",
"description": "Branch to deploy from. Only valid with repo; defaults to the repository's default branch."
},
"staged": {
"type": "boolean",
"default": false,
"description": "Stage the change in the environment's pending changes instead of applying it live. It takes effect only when the staged changes are committed with accept-deploy (or the user applies them in the dashboard)."
},
"commitSha": {
"type": "string",
"pattern": "^[0-9a-f]{7,40}$",
"description": "Commit SHA to pin the service to. Only valid with repo. The service deploys exactly this commit and pushes to the branch no longer deploy it, until the source is connected again without commitSha."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "The service ID to attach the source to"
},
"environmentId": {
"type": "string",
"description": "Environment to scope a staged source change to. Only valid with staged: true, and required by it — a live connect always applies to every environment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service",
"source",
"staged"
],
"properties": {
"source": {
"type": "object",
"required": [
"repo",
"branch",
"commitSha",
"image"
],
"properties": {
"repo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"branch": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"commitSha": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The commit the service is pinned to, if any"
}
},
"additionalProperties": false
},
"staged": {
"anyOf": [
{
"type": "object",
"required": [
"patchId",
"changeCount"
],
"properties": {
"patchId": {
"type": "string",
"description": "The environment patch holding the change"
},
"changeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total changes now staged in the environment"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Present when the change was staged instead of applied. It takes effect only when the staged changes are committed with accept-deploy."
},
"service": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Connect service source",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List a project's webhooks: for each, the URL Railway POSTs to, the deployment, monitor and volume-alert events that trigger it, whether it covers preview (PR) environments, the names of its custom headers (values are write-only), and its ID for update-webhook and delete-webhook.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Create a project webhook: Railway POSTs a JSON payload to the URL whenever one of the chosen deployment, monitor or volume-alert events happens in the project. Defaults to the deployment failure events (failed, crashed, out of memory) across regular and preview environments. This tool does not take custom headers or other secrets: if the endpoint needs an auth or signature header, the user adds it to the webhook in the Railway dashboard. Discord and Slack incoming-webhook URLs are detected and receive a formatted message. Use test-webhook first to check the URL accepts the payload.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
url
The URL Railway POSTs to when a matching event occurs. A Discord or Slack incoming-webhook URL is detected and gets a formatted message instead of the raw JSON.
Clear enough to supply this argument.
eventTypes
Events that trigger the webhook. Defaults to Deployment.failed, Deployment.crashed and Deployment.oom_killed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
includePreviewEnvironments
Also fire for preview (PR/ephemeral) environments. Defaults to true.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"webhook"
],
"properties": {
"webhook": {
"type": "object",
"required": [
"id",
"url",
"eventTypes",
"includesPreviewEnvironments",
"headerNames"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook ID, used by update-webhook and delete-webhook"
},
"url": {
"type": "string",
"description": "The URL Railway POSTs to"
},
"eventTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "The events that trigger it"
},
"headerNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the custom headers sent with each delivery. Values are write-only."
},
"includesPreviewEnvironments": {
"type": "boolean",
"description": "Whether it also fires for preview (PR/ephemeral) environments"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-webhook",
"description": "Create a project webhook: Railway POSTs a JSON payload to the URL whenever one of the chosen deployment, monitor or volume-alert events happens in the project. Defaults to the deployment failure events (failed, crashed, out of memory) across regular and preview environments. This tool does not take custom headers or other secrets: if the endpoint needs an auth or signature header, the user adds it to the webhook in the Railway dashboard. Discord and Slack incoming-webhook URLs are detected and receive a formatted message. Use test-webhook first to check the URL accepts the payload.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL Railway POSTs to when a matching event occurs. A Discord or Slack incoming-webhook URL is detected and gets a formatted message instead of the raw JSON."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"eventTypes": {
"type": "array",
"items": {
"enum": [
"VolumeAlert.triggered",
"VolumeAlert.resolved",
"Monitor.triggered",
"Monitor.resolved",
"Monitor.deleted",
"Deployment.crashed",
"Deployment.oom_killed",
"Deployment.failed",
"Deployment.deployed",
"Deployment.redeployed",
"Deployment.slept",
"Deployment.resumed",
"Deployment.restarted",
"Deployment.removed",
"Deployment.building",
"Deployment.deploying",
"Deployment.waiting",
"Deployment.needs_approval",
"Deployment.queued"
],
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Events that trigger the webhook. Defaults to Deployment.failed, Deployment.crashed and Deployment.oom_killed."
},
"includePreviewEnvironments": {
"type": "boolean",
"description": "Also fire for preview (PR/ephemeral) environments. Defaults to true."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"webhook"
],
"properties": {
"webhook": {
"type": "object",
"required": [
"id",
"url",
"eventTypes",
"includesPreviewEnvironments",
"headerNames"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook ID, used by update-webhook and delete-webhook"
},
"url": {
"type": "string",
"description": "The URL Railway POSTs to"
},
"eventTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "The events that trigger it"
},
"headerNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the custom headers sent with each delivery. Values are write-only."
},
"includesPreviewEnvironments": {
"type": "boolean",
"description": "Whether it also fires for preview (PR/ephemeral) environments"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create webhook",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Change a project webhook's URL, the events that trigger it, or whether it covers preview (PR) environments. Only the fields passed change; eventTypes replaces the whole set. Custom headers the user set in the Railway dashboard are kept as they are — this tool does not take header values or other secrets. Get the webhook ID from list-webhooks.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
webhookId
The webhook ID, from list-webhooks
Clear enough to supply this argument.
url
The URL Railway POSTs to when a matching event occurs. A Discord or Slack incoming-webhook URL is detected and gets a formatted message instead of the raw JSON.
Clear enough to supply this argument.
eventTypes
Replaces the events that trigger the webhook. Omit to leave unchanged.
Clear enough to supply this argument.
includePreviewEnvironments
Omit to leave unchanged.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Delete a project webhook so Railway stops POSTing to its URL. Get the webhook ID from list-webhooks. This cannot be undone; create-webhook makes a new one.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
POST a sample event payload to a URL and report the HTTP status it answered with, to check a webhook endpoint before creating or after updating a webhook. Pass a URL to try a new endpoint, or a webhookId to send to an existing webhook with its stored URL and any custom headers the user set on it in the dashboard. This tool does not take header values or other secrets. Nothing is stored. Discord and Slack incoming-webhook URLs receive a formatted message, like a real event would.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Explain the meaning of this value, not just its name.
projectId
The project ID
Explain the meaning of this value, not just its name.
url
The URL to POST the sample to. Required unless webhookId is given, in which case it defaults to that webhook's URL.
Clear enough to supply this argument.
webhookId
An existing webhook to test: its stored URL and custom headers are used. Get it from list-webhooks.
Clear enough to supply this argument.
eventType
The event type of the sample payload. Defaults to Deployment.failed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"url",
"eventType",
"statusCode",
"delivered",
"headerNames"
],
"properties": {
"url": {
"type": "string"
},
"delivered": {
"type": "boolean",
"description": "Whether the URL answered with a 2xx status"
},
"eventType": {
"type": "string",
"description": "The sample event type that was sent"
},
"statusCode": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The HTTP status the URL answered with, or 0 when the request failed (unreachable host, timeout, blocked address)."
},
"headerNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the custom headers sent with the sample"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "test-webhook",
"description": "POST a sample event payload to a URL and report the HTTP status it answered with, to check a webhook endpoint before creating or after updating a webhook. Pass a URL to try a new endpoint, or a webhookId to send to an existing webhook with its stored URL and any custom headers the user set on it in the dashboard. This tool does not take header values or other secrets. Nothing is stored. Discord and Slack incoming-webhook URLs receive a formatted message, like a real event would.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL to POST the sample to. Required unless webhookId is given, in which case it defaults to that webhook's URL."
},
"eventType": {
"enum": [
"VolumeAlert.triggered",
"VolumeAlert.resolved",
"Monitor.triggered",
"Monitor.resolved",
"Monitor.deleted",
"Deployment.crashed",
"Deployment.oom_killed",
"Deployment.failed",
"Deployment.deployed",
"Deployment.redeployed",
"Deployment.slept",
"Deployment.resumed",
"Deployment.restarted",
"Deployment.removed",
"Deployment.building",
"Deployment.deploying",
"Deployment.waiting",
"Deployment.needs_approval",
"Deployment.queued"
],
"type": "string",
"description": "The event type of the sample payload. Defaults to Deployment.failed."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"webhookId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "An existing webhook to test: its stored URL and custom headers are used. Get it from list-webhooks."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"url",
"eventType",
"statusCode",
"delivered",
"headerNames"
],
"properties": {
"url": {
"type": "string"
},
"delivered": {
"type": "boolean",
"description": "Whether the URL answered with a 2xx status"
},
"eventType": {
"type": "string",
"description": "The sample event type that was sent"
},
"statusCode": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The HTTP status the URL answered with, or 0 when the request failed (unreachable host, timeout, blocked address)."
},
"headerNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of the custom headers sent with the sample"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Test webhook",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
DESTRUCTIVE: Commits all staged changes in a Railway environment and triggers a deploy. Only use this when the user has explicitly confirmed they want to deploy.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
The environment ID to commit staged changes for
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
commitMessage
Optional commit message for the deploy
Explain what happens when this optional value is omitted.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Hand a multi-step task in one project environment to Railway's own AI agent, for work too open-ended for the direct tools: investigating a failing deploy across services, or planning and making a set of related changes. The agent reads the environment's config, logs, metrics and linked GitHub repository, and searches the web and Railway docs. It can also change the environment as the calling user: create, update and remove services, volumes, buckets and webhooks, set variables, restart services, deploy its staged changes, and open pull requests on the linked repository. Describe the task in plain language and say what it may change; do not put passwords, API keys or other secrets in the message. A call waits up to 4 minutes; if the agent is still working it returns early with a threadId — pass it back as threadId to continue the same conversation, which also works for follow-up questions. For a single read or change, use the direct tool instead (get-logs, set-variables, update-service and so on).
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
projectId
The project ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
environmentId
The environment ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
message
The message to send to the agent
Explain the meaning of this value, not just its name.
threadId
Thread ID to continue an existing conversation. Omit to start a new one.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"threadId",
"response",
"toolCalls"
],
"properties": {
"response": {
"type": "string",
"description": "Railway Agent's final response text"
},
"threadId": {
"type": "string",
"description": "Thread ID for continuing the agent conversation"
},
"toolCalls": {
"type": "array",
"items": {
"type": "object",
"required": [
"toolName",
"isError"
],
"properties": {
"isError": {
"type": "boolean",
"description": "Whether the sub-tool call failed"
},
"toolName": {
"type": "string",
"description": "Railway Agent sub-tool name"
}
},
"additionalProperties": false
},
"description": "Sub-tools used while producing the response. Their raw arguments and results stay in the agent's thread: they can hold variable values and internal IDs, and the response text already reports what matters."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "railway-agent",
"description": "Hand a multi-step task in one project environment to Railway's own AI agent, for work too open-ended for the direct tools: investigating a failing deploy across services, or planning and making a set of related changes. The agent reads the environment's config, logs, metrics and linked GitHub repository, and searches the web and Railway docs. It can also change the environment as the calling user: create, update and remove services, volumes, buckets and webhooks, set variables, restart services, deploy its staged changes, and open pull requests on the linked repository. Describe the task in plain language and say what it may change; do not put passwords, API keys or other secrets in the message. A call waits up to 4 minutes; if the agent is still working it returns early with a threadId — pass it back as threadId to continue the same conversation, which also works for follow-up questions. For a single read or change, use the direct tool instead (get-logs, set-variables, update-service and so on).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId",
"environmentId",
"message"
],
"properties": {
"message": {
"type": "string",
"description": "The message to send to the agent"
},
"threadId": {
"type": "string",
"description": "Thread ID to continue an existing conversation. Omit to start a new one."
},
"projectId": {
"type": "string",
"description": "The project ID"
},
"serviceId": {
"type": "string",
"description": "Optional service ID to scope the agent's context"
},
"environmentId": {
"type": "string",
"description": "The environment ID"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"threadId",
"response",
"toolCalls"
],
"properties": {
"response": {
"type": "string",
"description": "Railway Agent's final response text"
},
"threadId": {
"type": "string",
"description": "Thread ID for continuing the agent conversation"
},
"toolCalls": {
"type": "array",
"items": {
"type": "object",
"required": [
"toolName",
"isError"
],
"properties": {
"isError": {
"type": "boolean",
"description": "Whether the sub-tool call failed"
},
"toolName": {
"type": "string",
"description": "Railway Agent sub-tool name"
}
},
"additionalProperties": false
},
"description": "Sub-tools used while producing the response. Their raw arguments and results stay in the agent's thread: they can hold variable values and internal IDs, and the response text already reports what matters."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Railway agent",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search Railway docsSearch the Railway documentation (docs.railway.com) for features, configuration, guides, and tutorials.
02Search templatesSearch the Railway template marketplace by name, description or keyword — databases (postgres, mysql, mongo, redis, clickhouse), their high-availability vari…
03List workspacesList the Railway workspaces the current user belongs to.
04List projectsList all Railway projects accessible to the authenticated user
05Get the current authenticated Railway user's profile information
Want to run these tasks against your MCP server with us?
accept-deploycreate-deploymentcreate-projectdelete-feature-flagdeploy-artifactget-feature-flagget-logsget-statuslist-deploymentslist-feature-flagslist-projectslist-services+4 more
railway setup, tools, quality score, publishing readiness, and alternatives.
How do I add railway to Claude, ChatGPT, or Cursor?
Add railway to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.railway.com/. This server requires OAuth, so complete the login prompt after you connect.
Is railway MCP ready for ChatGPT and Claude?
As of October 6, 2026, railway scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is railway's MCP tool documentation?
As of October 6, 2026, railway scores 87/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 68 of 68 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the railway MCP server provide?
railway lists 16 MCP tools, including accept-deploy, create-deployment, create-project, delete-feature-flag, deploy-artifact, get-feature-flag, get-logs, get-status, list-deployments, list-feature-flags, list-projects, and list-services.
What are the best alternatives to railway?
As of October 20, 2026, alternatives to railway in developer-tools on the Manufact MCP leaderboard include Held at the Gate, Speko, turva.dev, AgentMail, and AgentPhone.
Does railway MCP require authentication?
railway requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can railway improve its MCP documentation?
list-domains is the lowest-scoring reviewed tool at 73/100. Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops railway?
railway is developed by Railway. It is listed as partner on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.