You'll need
- A DevFellowship account (you sign in with GitHub).
- Node.js 20 or newer — only for the one-time login CLI. Check with
node -v. - An MCP-compatible client: Claude Code, Cursor, VS Code, codex, or the Anthropic SDK. Any one is fine.
This is the full path from zero to a working MCP connection and your first tool call. No prior context assumed. Budget about five minutes.
You'll need
node -v.dfl-authThe dfl-auth CLI runs the GitHub OAuth flow and stores your token locally.
No install needed — npx fetches it on demand.
Configure the Supabase project (one time per machine):
npx @devfellowship/dfl-auth configureLog in — this opens your browser for GitHub OAuth:
npx @devfellowship/dfl-auth loginConfirm you’re authenticated:
npx @devfellowship/dfl-auth statusYour credentials are written to ~/.dfl-mcp/:
| File | Contents |
|---|---|
~/.dfl-mcp/project.json | Supabase project configuration |
~/.dfl-mcp/credentials.json | access_token + refresh_token + expires_at |
Prefer a global install?
npm install -g @devfellowship/dfl-authdfl-auth loginThe DFL MCP is split into 14 hosts, one per area. Add only the hosts you need. All hosts use the same login; only the tool set changes.
thumbnail.mcp.devfellowship.com is an alias of the Lesson Studio host until
2026-12-04. Use studio.mcp.devfellowship.com for generate_thumbnail.
| Host | Endpoint | Use it for |
|---|---|---|
| Learn | https://learn.mcp.devfellowship.com/mcp | members, profiles, courses, lessons, programs, progress, wiki |
| Work | https://work.mcp.devfellowship.com/mcp | projects, epics, deliveries, tasks, business units, placements |
| Engineering | https://engineering.mcp.devfellowship.com/mcp | spec runs, task assignment, diagrams, documents, sheets, UX maps |
| Plans | https://plans.mcp.devfellowship.com/mcp | plans, ADRs, questions |
| Payments | https://payments.mcp.devfellowship.com/mcp | transactions, fellow payments (invoices) |
| Accounting ledger | https://financing.mcp.devfellowship.com/mcp | accounts, journal entries, ingest, reconciliation |
| Lesson Studio | https://studio.mcp.devfellowship.com/mcp | video lessons, slides and YouTube thumbnails |
| Campaigns | https://campaigns.mcp.devfellowship.com/mcp | social posts, review queue, analytics |
| Strategy | https://strategy.mcp.devfellowship.com/mcp | Business Model Canvas, personas, competitors |
| Proposals | https://proposals.mcp.devfellowship.com/mcp | public tenders, answer library, submissions |
| Events | https://events.mcp.devfellowship.com/mcp | events, sessions, guests, check-in |
| Forms & quizzes | https://quiz.mcp.devfellowship.com/mcp | forms, quizzes, interview dispatch |
| Platform (ops) | https://ops.mcp.devfellowship.com/mcp | identity, IAM, apps, media, sandboxes, agent comms |
| Skills | https://skills.mcp.devfellowship.com/mcp | DFL Forge skills |
Each host page lists every tool with its parameters. All MCP hosts groups them by goal.
Pick your client below. Replace YOUR_ACCESS_TOKEN with the token from step 1.
Add or remove server blocks to match the hosts you want.
Add to your project’s .mcp.json (or the global ~/.claude/mcp.json). One block
per domain:
{ "mcpServers": { "dfl-work": { "type": "http", "url": "https://work.mcp.devfellowship.com/mcp", "headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" } }, "dfl-learn": { "type": "http", "url": "https://learn.mcp.devfellowship.com/mcp", "headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" } } }}Then restart Claude Code (or run /mcp to reconnect). You should see the
dfl-work / dfl-learn tools appear.
Cursor needs mcp-remote as a proxy so the Authorization header is passed
correctly. Add to ~/.cursor/mcp.json:
{ "mcpServers": { "dfl-work": { "command": "npx", "args": [ "mcp-remote", "https://work.mcp.devfellowship.com/mcp", "--transport", "http-only", "--header", "Authorization:${DFL_TOKEN}" ], "env": { "DFL_TOKEN": "Bearer YOUR_ACCESS_TOKEN" } } }}VS Code (1.102+) has native MCP support. Add to your workspace
.vscode/mcp.json (or run MCP: Add Server from the command palette):
{ "servers": { "dfl-work": { "type": "http", "url": "https://work.mcp.devfellowship.com/mcp", "headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" } } }}For older MCP extensions (e.g. Continue) that only speak SSE, use the
mcp-remote proxy pattern shown in the Cursor tab.
Add each desired server to ~/.codex/config.toml:
[[mcp_servers]]name = "dfl-work"url = "https://work.mcp.devfellowship.com/mcp"[mcp_servers.headers]Authorization = "Bearer YOUR_ACCESS_TOKEN"
[[mcp_servers]]name = "dfl-learn"url = "https://learn.mcp.devfellowship.com/mcp"[mcp_servers.headers]Authorization = "Bearer YOUR_ACCESS_TOKEN"Pass the endpoints in the mcp_servers array:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create( model="claude-sonnet-4-5", max_tokens=1024, mcp_servers=[ { "type": "url", "url": "https://work.mcp.devfellowship.com/mcp", "name": "dfl-work", "authorization_token": "YOUR_ACCESS_TOKEN", }, ], messages=[{"role": "user", "content": "Show me my open tasks"}],)Once the client connects, just ask in natural language — the model picks the tool. Try:
“List my projects.” → calls
list_projectson dfl-work“What courses am I enrolled in?” → calls
list_courses/list_memberson dfl-learn
Want to verify the wiring without a client? Hit any endpoint directly:
# Health (no auth) — should return {"status":"ok", ...}curl https://work.mcp.devfellowship.com/health
# Initialize a session (auth required)curl -X POST https://work.mcp.devfellowship.com/mcp \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": { "name": "curl-test", "version": "1.0.0" } } }'A 200 with a result means you’re connected. See every host and its tools
in All MCP hosts.
401 UnauthorizedYour token is missing, malformed, or expired.
Authorization: Bearer <token> (one space).403 ForbiddenYou’re authenticated, but your permissions don’t allow this. The MCP runs every call as you under Row-Level Security, so you only see/modify what your IAM role permits. This is expected, not a bug — see Auth & security.
Tokens are short-lived. Renew without re-running the browser login:
npx @devfellowship/dfl-auth refreshimport { getValidAccessToken } from '@devfellowship/dfl-auth';
// Reads ~/.dfl-mcp/credentials.json, auto-refreshes if expired.const token = await getValidAccessToken();Every endpoint exposes a refresh proxy (no auth header needed):
curl -X POST https://work.mcp.devfellowship.com/auth/refresh \ -H "Content-Type: application/json" \ -d '{"refresh_token": "YOUR_REFRESH_TOKEN"}'work.mcp.devfellowship.com. The old
dashed scheme (mcp- in front of the domain name) no longer resolves./mcp. /health is open; /mcp requires auth.npx errors on Node v25Clear the npx cache and retry:
rm -rf ~/.npm/_npxEach endpoint rate-limits (~100 req/min by default). Back off and retry.