All agents

Anthropic

Claude Code

Connect DataFeeds to Claude Code with one entry in .mcp.json, verify it with a live call, and start asking for real data.

1. Get a token

Register at the API Locker to generate an RSC_token. New accounts include a 30-day free trial.

2. Put it in your environment

Claude Code reads the token from the RSC_TOKEN environment variable rather than storing it in a config file. Add it to your shell profile (~/.zshrc, ~/.bashrc) or your secret store:

export RSC_TOKEN='your-token-here'

Then open a new terminal, or source the profile, so the variable is live in the session you start Claude Code from.

Never paste your raw token into an agent chat. Anything you type into a conversation may be persisted in a transcript, synced to a vendor, or written into a log you don't control. Set the environment variable and let Claude Code reference it — no step on this page needs the token's value to appear anywhere. If a token has already been pasted somewhere it shouldn't be, rotate it in the API Locker.

3. Add the server

Add the server to .mcp.json in your project root (or ~/.claude.json to make it available everywhere):

{
  "mcpServers": {
    "datafeeds": {
      "type": "http",
      "url": "https://mcp.datafeeds.rolling-insights.com/mcp",
      "headers": {
        "Authorization": "Bearer ${RSC_TOKEN}"
      }
    }
  }
}

If the file already exists, merge the datafeeds entry into the existing mcpServers object rather than replacing the file. The /mcp path is required — the bare hostname will not work. ${RSC_TOKEN} is Claude Code's own expansion syntax: it reads the variable at run time, so the token's value never touches the file.

A note on mcp add commands. Set the server up by editing the file, as above — not with a shell command like:

# Don't do this — the token ends up in the file in plaintext.
claude mcp add --transport http datafeeds https://mcp.datafeeds.rolling-insights.com/mcp \
  --header "Authorization: Bearer ${RSC_TOKEN}"

Your shell expands ${RSC_TOKEN} before Claude Code ever sees the argument, so what gets written to the config is your live token in clear text — exactly the outcome the environment-variable pattern exists to avoid.

4. Verify

Restart Claude Code, then run claude mcp list — datafeeds should report connected. That check proves the config parses, not that the token works: with RSC_TOKEN unset, Claude Code warns but still passes the literal placeholder through, and the failure only surfaces on a real call. So ask for live data:

Using the DataFeeds tools, what NBA games are on today?

A working connection returns real games. If it doesn't, troubleshooting below separates URL problems from token problems.

5. Enable the skill

The server above gives Claude Code live data. The Sports AI Skill also teaches it the API's conventions — sport codes, season semantics, which endpoints exist per sport — so the code it writes against the REST API is right the first time. One command enables it:

npx skills add Rolling-Insights/sports-datafeeds-by-rolling-insights-skill -a claude-code -y

-a scopes the skill to Claude Code, and -y auto-confirms; the CLI prints its security assessment either way. The command needs Node.js 22.20.0 or newer — switch with nvm use 22 if npx reports EBADENGINE. It touches no MCP config and never involves your token.

Troubleshooting

The connection fails, or every tool call reports a rejected token

This is the most common problem, and it almost always means RSC_TOKEN was not set in the environment Claude Code was launched from.

The failure is quiet, because there is nothing in the exchange that tells Claude Code to prompt you for credentials. Our server answers an unauthenticated request with a plain 401 and no WWW-Authenticate header, since it does not implement the OAuth discovery flow — Claude Code documents that a rejected Authorization header is reported as a failed connection rather than triggering a login.

Worse, an unset variable does not necessarily fail loudly. Claude Code warns in claude mcp list but passes the literal text ${RSC_TOKEN} through as the header value. The config looks correct, the server accepts the malformed bearer token at the transport layer, and the failure only surfaces when a tool call comes back reporting that DataFeeds rejected the token. A live call is the only reliable check.

To fix it:

# Confirm the variable is set — without printing its value.
[ -n "$RSC_TOKEN" ] && echo "RSC_TOKEN is set" || echo "RSC_TOKEN is NOT set"

If it's unset, add it to your shell profile, then open a new terminal and restart Claude Code from there — it inherits the environment of the shell that launched it.

Is it the URL or the token?

Check the unauthenticated health endpoint first:

curl -sS https://mcp.datafeeds.rolling-insights.com/healthz
# {"status":"ok"}
  • Anything other than {"status":"ok"} — wrong URL, or a network or DNS problem. Confirm the host, and confirm your config includes the /mcp path.
  • {"status":"ok"} but Claude Code still can't connect — the server is fine and the problem is the token or the config syntax.

GET /mcp returns 405

Expected, not a fault. The server speaks Streamable HTTP and is POST-only — there is no server-to-client event stream to open with a GET. Opening the URL in a browser will show this. It says nothing about whether your setup works.

401 versus 403

The two are diagnostic, and the difference matters:

  • 401 — the token was rejected. It's missing, malformed, expired, or wrong.
  • 403 — the token is valid and authentication succeeded, but your account isn't entitled to that sport or resource. Check your plan in the API Locker, or contact support.

A 403 is therefore good news about your credentials.

Still stuck

Email support@rolling-insights.com with what you tried and what you see — mention you're using Claude Code. Please don't include your token.