What you're about to build
When you finish this guide, opening Claude Code inside any client repo will let you ask "pull workspace acme-corp" and have your personal CLAUDE.md, subagents, skills, and slash commands land in .claude/ — without ever touching the client's .gitignore or appearing in git status. When the engagement ends, one cleanup call leaves the repo bit-identical to where it started.
The pieces:
- The platform — this site. Where you author and version your context files.
- An API key — minted on the platform, lives in your shell rc, scoped to your user.
- The MCP server (
mcpcall) — a stdio process Claude Code spawns. It owns no data; it just talks to the platform over HTTPS using your API key. - A
.mcp.jsonfile — sits in your client repo, tells Claude Code how to launch the MCP server.
Get an account
Signup is open — no invite needed. Free during beta.
Visit signup
Open /signup. Use email (magic link) or GitHub. No invite code required.
Confirm via your provider
Email: magic link arrives from onboarding@resend.dev. Click it; you land on /workspaces signed in. GitHub: one tap, you're in.
Create a workspace
A workspace is one bundle of context files. Typically one per client or per project. The slug (e.g. acme-corp) becomes the identifier used in every MCP call.
From /workspaces, click New workspace
Slug rules: lowercase alphanumerics and hyphens, 1–64 chars, no leading or trailing hyphen. Examples: acme-corp, side-project, 2026-internal.
Open it
The editor has a file tree on the left, Monaco on the right, and version history on demand. Files inside the workspace use relative POSIX paths: CLAUDE.md, agents/reviewer.md, skills/auth/SKILL.md.
Mint an API key
The MCP server (and any direct REST call) authenticates with a bearer token. Mint one and keep it in your shell.
Open /settings/api-keys
Click New key. Give it a name (e.g. "laptop", "ci"). Submit.
Copy the full token immediately
The token is shown exactly once. Format: mc_live_<prefix>_<secret>. The platform stores only the prefix + sha256(secret) — so once you close the modal, the full token is unrecoverable. Mint a new one if you lose it.
Revoke any key you no longer need
One click. Revoked keys can never be reactivated.
Wire your shell
The MCP server and any direct REST call read one environment variable: MCPCALL_API_KEY. Add it to your shell rc once, never to .mcp.json (which often gets committed).
# Add to ~/.bashrc or ~/.zshrc
export MCPCALL_API_KEY="mc_live_AbCd1234_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Then reload:
source ~/.bashrc # or ~/.zshrc
echo $MCPCALL_API_KEY # should print your token@asad120414/mcpcall@0.1.1 the platform URL is baked into the binary, so MCPCALL_API_URL is no longer required. Set it only if you point at a self-hosted instance (e.g. export MCPCALL_API_URL=http://localhost:3000 against a local dev server).Never paste the literal token into a tracked file.
.mcp.json is commonly committed by teams. Reference ${MCPCALL_API_KEY} from env so the token stays in your shell.
Install the MCP server
Recommended: register mcpcall once at the user scope in Claude Code. After that, every claude session in any directory auto-loads the MCP — no .mcp.json to drop into individual repos.
claude mcp add mcpcall --scope user -- npx -y @asad120414/mcpcallThat writes the config to ~/.claude/ (your home, not the project). Verify:
claude mcp listTo remove later: claude mcp remove mcpcall --scope user.
Alternative — per-project .mcp.json: drop this file at the root of any client repo. Useful when you want a teammate cloning the same repo to inherit the MCP setup automatically (the file is safe to commit since it references env vars, not literal tokens).
{
"mcpServers": {
"mcpcall": {
"command": "npx",
"args": ["-y", "@asad120414/mcpcall"],
"env": {
"MCPCALL_API_KEY": "${MCPCALL_API_KEY}"
}
}
}
}npx -y @asad120414/mcpcall resolves and runs the published package. The bin name stays mcpcall. No global install required; npx caches the binary after the first run.
Hacking on the server itself? Clone the repo and point at the local build instead:
git clone https://github.com/asd120414/team-agents-platform.git
cd team-agents-platform
pnpm install
pnpm --filter mcpcall buildThat produces packages/mcp-server/dist/index.js (mode 0755 with a Node shebang). Reference it from .mcp.json:
{
"mcpServers": {
"mcpcall": {
"command": "node",
"args": [
"/absolute/path/to/team-agents-platform/packages/mcp-server/dist/index.js"
],
"env": {
"MCPCALL_API_KEY": "${MCPCALL_API_KEY}"
}
}
}
}Verify the MCP loads
Open Claude Code in the project
cd /path/to/client/project
claudeCheck that mcpcall is connected
In Claude Code, type /mcp. You should see a server named mcpcall listed with 10 tools. If you don't, the most common cause is an unset API key — check echo $MCPCALL_API_KEY in the same shell where you launched Claude Code.
First call
Ask Claude:
list my workspacesIt calls list_workspaces and prints whatever workspaces exist on your account.
The daily flow
Once installed, this is the loop you run every time you sit down on a client project.
Pull context into the repo
pull_workspace acme-corpFiles land in .claude/ and any root files (CLAUDE.md, RULES.md) go at the repo root. A sentinel block is appended to .git/info/exclude so nothing shows up in git status. A manifest is written to .claude/.team-agents.json for drift detection.
If a local file already exists with different content, it's never clobbered. The pulled bytes go to <path>.incoming instead and the conflict is reported back.
Pass prefix to pull only a subtree — e.g. pull_workspace acme-corp prefix=agents pulls only files under agents/. Useful when a workspace has grown but you only want the subagents in this checkout.
Pull a single file
pull_file acme-corp agents/reviewer.mdSame conflict-safe semantics as pull_workspace: writes .incoming on sha mismatch, updates the local manifest, refreshes the sentinel block. Use when you only want one file pulled into a repo without the full workspace.
Author or edit
Open the pulled files in your editor and write. Or edit them on the web at /workspaces/acme-corp. Both directions round-trip safely.
Push changes back
push_file acme-corp agents/reviewer.mdReads the file from disk, computes the sha, and uploads. A new version row is recorded only when the content actually changed.
Bulk-import a local directory
import_folder acme-corp ./my-context dry_run=trueWalks source_dir, filters by globs (default **/*.md, **/*.mdx), uploads matched files via PUT. Symlink-defended; 2 MB per-file cap; 200 files per call. Run with dry_run=true first to preview, then drop the flag to commit. You can also drag-and-drop a folder onto the Import button in the web editor.
Check drift
statusRead-only diff of local manifest vs. remote. Reads the manifest at the current directory — no workspace arg. No disk writes. Useful before cleanup.
Cleanup
cleanupRemoves only files whose local sha256 matches the manifest. Strips the sentinel block from .git/info/exclude. Deletes the local manifest. No workspace arg — operates on whatever's in the local manifest. Files with local edits are skipped and reported. Pass force=true only when you're sure.
Direct REST API (no MCP)
If you'd rather skip MCP — for scripts, CI, custom tooling — every MCP tool is also a plain HTTP endpoint under /api/mcp/v1/. Same bearer auth.
List workspaces
curl -H "Authorization: Bearer $MCPCALL_API_KEY" \
https://team-agents-platform-web.vercel.app/api/mcp/v1/workspacesRead a workspace manifest
curl -H "Authorization: Bearer $MCPCALL_API_KEY" \
https://team-agents-platform-web.vercel.app/api/mcp/v1/workspaces/acme-corp/filesGet a single file
curl -H "Authorization: Bearer $MCPCALL_API_KEY" \
https://team-agents-platform-web.vercel.app/api/mcp/v1/workspaces/acme-corp/files/CLAUDE.mdReturns { "content": "..." }. The JSON envelope lets binary-safe transports stay text.
Create or update a file
curl -X PUT \
-H "Authorization: Bearer $MCPCALL_API_KEY" \
-H "content-type: application/json" \
-d '{"content":"# new content"}' \
https://team-agents-platform-web.vercel.app/api/mcp/v1/workspaces/acme-corp/files/CLAUDE.mdPUT upserts. A new version row is appended only when content actually changes (sha256 compared).
Delete a file
curl -X DELETE \
-H "Authorization: Bearer $MCPCALL_API_KEY" \
https://team-agents-platform-web.vercel.app/api/mcp/v1/workspaces/acme-corp/files/agents/old.mdSoft-delete. Version history preserved on the platform; the file leaves the manifest.
Troubleshooting
- /mcp shows no mcpcall server
- Almost always an unset API key. In the SAME shell where you launched Claude Code, run
echo $MCPCALL_API_KEY. If empty, your~/.bashrcdidn't apply — open a new terminal orsourceit manually before launching Claude Code. - 401 / not authorized
- The API key is wrong or revoked. Re-check the token. Mint a new one if needed. Tokens with stray whitespace or quotes around them in the env var are a frequent cause.
- 404 on /api/mcp/v1/workspaces/<slug>
- Either the workspace slug doesn't exist on your account, or the slug has a typo.
list_workspacesfirst to confirm. - pull_workspace wrote .incoming files
- Local file already exists with different content. Diff
<path>.incomingvs<path>, merge by hand, delete the.incoming. - cleanup left files behind
- A skipped file means its local sha256 doesn't match the manifest — you edited it after pulling. Save the edits to the platform first (
push_file), then cleanup. Or passforce=trueif you intend to discard. - Magic link email didn't arrive
- Resend's free tier delivers only to verified addresses. If the magic link doesn't arrive in a minute or two, use the Continue with GitHub button instead — GitHub OAuth is wired in production and bypasses email entirely.
- .mcp.json checked into the client repo
- Fine as long as the env values use
${MCPCALL_API_KEY}rather than literals. The file path is also visible to the client — if you don't want even that, add.mcp.jsonto your own machine's user-local ignore via.git/info/exclude.