Connect AI Agents to Your RC Account (Voyager MCP)
Level: Intermediate · Time: 10 min · Category: How-to
Tags: MCP · Voyager · Claude Code · OpenCode · VS Code
The Voyager portal runs an MCP server, voyager-mcp, that gives an AI agent read access to your Research Computing account. Once connected, an agent such as Claude Code, OpenCode, or VS Code agent mode can answer questions like "why did job 4821337 fail?" or "which of my GPU jobs are underusing their GPUs?" from live data. It can also write a batch script that matches your allocations and the hardware that exists, and it can search this documentation site. With the workflow capability, it can design and deploy Kubernetes workflows for you.
MCP (Model Context Protocol) is the open standard AI agents use to call external tools. Each agent connection you create in Voyager has its own token. That token acts as you, limited to the capabilities you select when you create it.
- A Voyager account. Any account works. Which tools you get depends on the services you hold (an HPC cluster account, Kubernetes access, and so on).
- The ASU network or the SSLVPN.
voyager.rc.asu.eduonly resolves on the ASU network, so the computer running your agent must be on campus or connected to the VPN. - An MCP client that supports remote (HTTP) servers with a custom
Authorizationheader. Claude Code, OpenCode, and VS Code all do. Clients that can only connect through an OAuth sign-in cannot use voyager-mcp yet.
voyager-mcp sends the data each tool returns to the model your agent is using. That data includes job names, paths, and account details. If that model is hosted by an outside company, the data is sent to that company. To keep it on Research Computing hardware, run your agent against the RC models; see Set up OpenCode. Check the ASU Data Classification Tool before connecting an agent to sensitive research data.
How it works
| Endpoint | https://voyager.rc.asu.edu/api/mcp |
| Transport | Streamable HTTP (stateless, JSON responses) |
| Authentication | Authorization: Bearer rcmcp_…, a token from your agent connection |
| Scope | Your own account only. No tool takes a username, and other users' jobs read as "not found". |
| Clusters | sol (the default) and phoenix (phx also works) |
| Rate limit | 20 tool calls per minute per connection |
1. Create an agent connection
- Sign in to the Voyager portal, open your profile, and select the Keys tab. The former MCP tab is now part of Keys.
- Click New agent connection. If you have none yet, click Create your first connection instead.
- Fill in the dialog:
- Name: what this connection is for, such as
Work laptoporClaude Code on Sol. Use one connection per agent or computer, so you can revoke one without breaking the others. - Capabilities: choose what the agent may access; see the table below. My jobs & GPU efficiency and My account & allocations are selected by default.
- Connection lifetime: 30 days, 90 days (recommended), 180 days, or 1 year (max).
- Name: what this connection is for, such as
- Click Create connection.
- Copy the token. It starts with
rcmcp_and is shown only once. The same dialog shows ready-to-paste setup for Claude Code, a.mcp.jsonfile, and OpenCode, with your token already filled in. Click I saved the token when you are done.
Anyone holding the token can use the capabilities you granted, as you, until it expires or you revoke it. Keep it out of Git repositories, shared notebooks, and screenshots. Voyager stores only a hash of the token, so it cannot show it to you again. If you lose it, revoke the connection and create a new one.
A few things to know:
- You can have up to 10 active connections.
- You cannot change a connection's capabilities or extend its lifetime. Create a new connection, then revoke the old one.
- Voyager emails you whenever a new agent connection is added to your account. If you did not create it, revoke it right away and contact us.
Capabilities
Every capability except the two marked writes is read-only. Capabilities your account cannot use are listed under the checkboxes as Not available on your account, with what each one needs.
| Capability | What the agent can see or do | Needs |
|---|---|---|
| My jobs & GPU efficiency | Your running and pending jobs, any one job in detail (state, exit code, the reason it ended, requested and allocated resources, steps), job history summaries, live GPU utilization, the GPU job archive, fix-it suggestions for low-utilization GPU jobs, and your login-node usage | HPC account |
| My account & allocations | Your profile (groups, sponsor, department, services), plus the Slurm accounts and QOS levels you can submit under | Any account; allocations need an HPC account |
| My storage & quotas | Home, scratch, and project quotas and usage, and scratch directories nearing expiry | HPC account |
| Software catalog | Search the module catalog on Sol and Phoenix | Any account |
| Job templates & how-tos | Job script templates (single-GPU training, CPU job arrays, interactive GPU sessions), a pending-job guide, and each cluster's node hardware | HPC account |
| RC documentation | Search and read this documentation site | Any account |
| My workflows & Kubernetes | The workflow template catalog, workflow validation, your saved workflows and run history, and what is running in your Kubernetes namespace | HPC account or Kubernetes access |
| Build & deploy workflows (writes) | Save workflow designs as drafts, and deploy saved Kubernetes workflows to your namespace | HPC account or Kubernetes access |
| My Jetstream2 cloud | Your Jetstream2 instances, volumes, floating IPs, quota, and service-unit balance | A Jetstream2 application credential, connected under the Jetstream2 tab |
| My Sim workflows / Build Sim workflows (writes) | Read, build, and revise workflows and knowledge bases in your Sim Studio workspace | A Sim API key, connected under Keys › Cluster tokens and outside services. Shown only where the Sim integration is enabled. |
| Job submission | Submit Slurm jobs as you. Shown as Coming soon; it cannot be granted yet. |
2. Add the connection to your agent
Use the endpoint https://voyager.rc.asu.edu/api/mcp and send the token in an
Authorization: Bearer header. Each example below reads the token from an environment variable, so
it does not end up in a config file or your shell history.
- Claude Code
- OpenCode
- VS Code
- Other clients
Read the token from a prompt, then register the server:
read -rs VOYAGER_MCP_TOKEN # paste the token, then press Enter (nothing is echoed)
claude mcp add --transport http --scope user voyager-mcp https://voyager.rc.asu.edu/api/mcp \
--header "Authorization: Bearer $VOYAGER_MCP_TOKEN"
unset VOYAGER_MCP_TOKEN
--scope user makes the server available in every project. Leave it out to add the server to the
current project only. Confirm the connection with claude mcp list, or run /mcp inside a Claude
Code session.
The .mcp.json snippet in Voyager's token dialog is the same server written as a project file.
If you keep .mcp.json in a repository, replace the token with ${VOYAGER_MCP_TOKEN}. Claude Code
expands environment variables in this file, so the token itself never gets committed:
{
"mcpServers": {
"voyager-mcp": {
"type": "http",
"url": "https://voyager.rc.asu.edu/api/mcp",
"headers": {
"Authorization": "Bearer ${VOYAGER_MCP_TOKEN}"
}
}
}
}
Add an mcp block to the opencode.json you already use with the RC models; see
Set up OpenCode. Keep your existing provider block. This adds a server next
to it:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"voyager": {
"type": "remote",
"url": "https://voyager.rc.asu.edu/api/mcp",
"headers": {
"Authorization": "Bearer {env:VOYAGER_MCP_TOKEN}"
},
"enabled": true
}
}
}
Set VOYAGER_MCP_TOKEN the same way you set OPENAI_API_KEY for OpenCode, then restart OpenCode.
The Skills library under AI LLM in Voyager is designed to work with these tools. Without an agent connection, those skills fall back to plain shell commands.
Create .vscode/mcp.json in your workspace, or run MCP: Open User Configuration from the
Command Palette to add the server for every workspace:
{
"inputs": [
{
"type": "promptString",
"id": "voyager-mcp-token",
"description": "Voyager agent connection token (rcmcp_...)",
"password": true
}
],
"servers": {
"voyager-mcp": {
"type": "http",
"url": "https://voyager.rc.asu.edu/api/mcp",
"headers": {
"Authorization": "Bearer ${input:voyager-mcp-token}"
}
}
}
}
VS Code asks for the token the first time the server starts and stores it securely, so the file holds no secret. Use the tools from Chat in Agent mode.
Any MCP client that supports a remote Streamable HTTP server with a custom header can connect:
- URL:
https://voyager.rc.asu.edu/api/mcp - Header:
Authorization: Bearer rcmcp_…
The server supports initialize, tools/list, tools/call, and ping. It has no SSE stream, no
sessions, and no OAuth sign-in.
Send a first request
Start your agent and ask something that needs your account. For example:
Use the voyager-mcp tools: what Slurm accounts and QOS levels can I submit under on Sol,
and do I have any jobs running right now?
Your agent should call get_my_allocations and get_my_active_jobs, and it may ask you to approve
each call first. If the agent answers without calling a tool, check that the server shows as connected
(see Troubleshooting).
What to ask
| Ask | Tools the agent uses |
|---|---|
| "Why did job 4821337 fail?" | get_my_job (state, exit code, signal, out-of-memory or timeout) |
| "Are any of my GPU jobs wasting their GPUs? How do I fix them?" | get_my_gpu_efficiency, get_gpu_job_suggestions |
| "Write me a single-GPU PyTorch training script for Sol." | list_job_templates, get_job_template, get_my_allocations, get_cluster_nodes, search_software, search_docs |
| "Why is my job still pending?" | get_my_job, the pending-job guide in get_job_template, get_cluster_nodes |
| "Am I close to my scratch quota? Is anything about to expire?" | get_my_storage |
| "How many GPU hours did I use last month, and how many jobs failed?" | get_my_job_history |
| "Is GROMACS installed on Phoenix? Which versions?" | search_software |
| "Am I running heavy work on a login node?" | get_my_login_node_usage |
| "Set up JupyterLab on Gaudi in my namespace, but don't deploy it yet." | list_workflow_templates, get_workflow_template, validate_workflow_graph, save_workflow_draft |
The agent writes job scripts for you to review and submit with sbatch. It cannot submit Slurm jobs
for you yet.
Tools
Your agent sees only the tools your connection's capabilities allow and your account holds. Everything returns your own data unless noted.
| Capability | Tool | Returns |
|---|---|---|
| My jobs & GPU efficiency | get_my_active_jobs | Running and pending jobs on one cluster (live scheduler state) |
get_my_job | One job in detail, running or finished: final state and reason, exit code and signal, requested vs. allocated resources, timing, nodes, working directory, step states | |
get_my_job_history | Job counts by final state, CPU and GPU hours, and a daily series for the last 1–365 days (default 7) across both clusters | |
get_my_gpu_efficiency | Live GPU utilization of running GPU jobs over a 4 h, 24 h, 7 d, or 30 d window, with the policy thresholds and each job's tier | |
get_my_gpu_history | Per-job archive of finished GPU jobs: utilization, memory, idle GPU-hours, energy. Paginated. | |
get_gpu_job_suggestions | Advice for 1–50 running GPU jobs flagged for low utilization: likely causes and concrete fixes | |
get_my_login_node_usage | CPU, memory, and "badness" per login node | |
| My account & allocations | get_my_account_profile | Display name, groups, sponsor, department, shell, services |
get_my_allocations | Slurm accounts, allowed QOS levels, default account | |
| My storage & quotas | get_my_storage | Home and scratch usage against quota, project and archive allocations, scratch nearing expiry (GB) |
| Software catalog | search_software | Matching modules and versions on Sol or Phoenix |
| Job templates & how-tos | list_job_templates / get_job_template | Job script templates with parameters and known pitfalls |
get_cluster_nodes | Each distinct node shape (CPUs, memory, GPU model and count, features), how many exist, and their states; filter by partition | |
| RC documentation | search_docs / get_doc_page / list_doc_pages | Search results, full pages, and the table of contents of this site |
| My workflows & Kubernetes | list_workflow_templates / get_workflow_template | The workflow catalog (FastFold, JupyterLab on Gaudi, vLLM on Gaudi, and more) and each template's graph |
validate_workflow_graph | Checks a workflow without saving it: issues per node, the compiled Kubernetes manifest or Slurm script, and portability to the other scheduler | |
list_my_workflows / get_my_workflow | Your saved workflow designs | |
get_my_workflow_runs | Your last 50 workflow runs and their outcomes | |
get_my_k8s_workloads | Deployments, jobs, pods, and volume claims in your namespace right now | |
| Build & deploy workflows | save_workflow_draft | Saves a design as a draft. Nothing runs. |
deploy_workflow | Deploys a saved Kubernetes workflow to your namespace | |
| My Jetstream2 cloud | get_my_cloud_instances / get_my_cloud_storage / get_my_cloud_quota / get_my_cloud_allocations | Instances, volumes and floating IPs, quota, and SU balance |
| My Sim workflows / Build Sim workflows | list_my_sim_workflows, get_sim_workflow, create_sim_workflow, revise_sim_workflow, and others | Your Sim Studio workflows, runs, blocks, and knowledge bases |
Tools that change things
Most tools only read. Two workflow tools change things, and the server marks both as destructive, so most clients ask you to approve each call:
save_workflow_draftsaves a design you can open on the visual canvas under Workflows & Apps. Without anidit creates a new design, which is always safe. With anidit overwrites that design, and the old version cannot be recovered.deploy_workflowcompiles a saved workflow and applies it to your Kubernetes namespace right away. It uses your quota. Every deploy appears in your run history and the audit log. Workflows that target Slurm can be built and validated, but not deployed yet.
The server tells agents to deploy only when you have clearly asked them to, and to save a draft otherwise. Say which one you want in your prompt.
The Build Sim workflows capability can also create, revise, rename, and permanently delete workflows and knowledge bases in your Sim workspace.
Limits and data freshness
- Rate limit: 20 tool calls per minute per connection token, shared by every client using that
token. A refused call returns an error with
error.data.retryAfterSecondsand aRetry-Afterheader; good agents wait that long. Give each agent its own connection. - Active jobs come from the live scheduler. A finished job disappears from
get_my_active_jobs; ask about it withget_my_job. - Job history comes from accounting data, which lags the scheduler by a few minutes.
- The GPU archive (
get_my_gpu_history) starts in late July 2026. For totals, useget_my_job_history. - Storage readings are cached and refreshed when they are over an hour old, so a call can take
about 15 seconds. A value of
unknownmeans no reading could be taken, not zero. - Documentation search covers this site and refreshes every few hours.
Manage your connections
Every connection is listed under Agent connections on the Keys tab. Each row shows:
- the name you gave it, and the client name and version the agent reported
- its status: Used … ago, Never used, Expires in N days, Expired, Revoked, or Disabled by account status
- its capabilities, a 7-day activity sparkline, and its call and failure counts
Details shows the token's first characters, the created and expiry dates, and every tool the connection can call.
The Agent activity sub-tab lists each tool call your agents made: the tool, the connection, the
status (ok, upstream error, denied, rate limited, invalid args), the duration, and when it
ran. Voyager records which tool ran and the names of its arguments, never their values.
- Revoke stops a connection immediately and cannot be undone. Revoke any connection whose token may have leaked.
- Delete appears after a connection is revoked or has expired. It removes the connection and its activity history from the list.
- If your account is locked or archived, its connections are suspended. They resume if the account is restored.
Troubleshooting
| Error or symptom | What it means |
|---|---|
Missing bearer token… | The client is not sending the Authorization: Bearer rcmcp_… header. Check the header name and that the environment variable is set in the shell that starts your agent. |
Unknown token… | The token is mistyped or truncated. Copy it again, or create a new connection. |
This connection was revoked… / This connection's token has expired… | Create a new connection in Keys. |
This connection is disabled because of the account's status… | Your account is locked or archived. Contact us. |
| The connection fails, or a browser shows a "VPN required" page | You are off the ASU network. Connect to the SSLVPN. |
Unknown tool: … | The connection does not include the capability for that tool, or your account does not hold the service it needs. Create a connection with the capability. |
Rate limit exceeded (20 calls/minute per connection token)… | Wait the number of seconds in the message. Ask the agent to work through results one call at a time. |
| Jetstream2 tools say no credential is connected | Add an OpenStack application credential under the Jetstream2 tab. |
| No Sim tools appear | Connect a Sim API key under Keys › Cluster tokens and outside services. |
| The agent answers without using any tools | Check the server is connected (claude mcp list, /mcp, or your client's MCP panel), then name the tools in your prompt: "Use the voyager-mcp tools to…" |
Related guides
- Getting Started with AI: set up an AI coding assistant, agents, and skills.
- Set up OpenCode: run an agent on the RC models.
- LLM API Access: API keys, models, and examples.
- Voyager Account Manager: everything else the portal does.