tndr-mcp
Tndr MCP Server
Connect Claude Desktop, Claude Code, Cursor, VS Code, or any MCP host to your Tndr account. Exposes your negotiation sessions, analytics, companies, deals, team, and webhooks as tools the AI can call — backed by the Tndr Platform API.
Requirements: a Tndr account on an Enterprise or Enterprise Plus plan, and an API key from Settings → API Access in the Tndr app. Node.js ≥ 20 for local (stdio) use.
Quick start
1. Get an API key
In the Tndr app: Settings → API Access → Generate key. Pick the scopes you want the AI to have:
- Read-only preset — safe default; every
get_*/list_*tool works. - Add
write:companies/write:deals/write:webhooksto let the AI create and update records. - Scopes are fixed per key — to change them, create a new key.
The key is shown once. Treat it like a password.
2. Configure your MCP host
Claude Desktop — add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"tndr": {
"command": "npx",
"args": ["-y", "tndr-mcp"],
"env": { "TNDR_API_KEY": "tndr_..." }
}
}
}
Claude Code:
claude mcp add tndr --env TNDR_API_KEY=tndr_... -- npx -y tndr-mcp
Cursor / VS Code — same command/args/env shape in .cursor/mcp.json or .vscode/mcp.json.
From source (if not installing from npm):
cd mcp-server && npm install && npm run build
then use "command": "node", "args": ["<absolute path>/mcp-server/build/index.js"] in the host config.
3. Use it
Restart the host and ask things like:
- "How am I doing on my negotiation practice?"
- "Brief me on Acme Steel before tomorrow's call."
- "Create a deal for the SteelCo renewal, ~$250k, closing end of Q3."
Configuration
All configuration is via environment variables (set in the host config, the process environment, or a .env file in the working directory — real environment variables win over .env).
| Variable | Default | Purpose |
|---|---|---|
TNDR_API_KEY |
— | Required. API key from Settings → API Access. |
TNDR_API_URL |
production Platform API | Override for staging/self-hosted. |
TRANSPORT |
stdio |
stdio (local hosts) or http (remote, Streamable HTTP). |
PORT |
3100 |
HTTP mode listen port (Cloud Run sets this automatically). |
HOST |
127.0.0.1 |
HTTP mode bind address. The Docker image sets 0.0.0.0. |
TNDR_TIMEOUT_MS |
30000 |
Per-request timeout against the Platform API. |
Tools
Every tool wraps one Platform API endpoint; the scope listed is what the API key must carry (the admin scope grants everything).
| Tool | What it does | Scope |
|---|---|---|
get_profile |
Profile: name, company, level, XP, negotiation style | read:profile |
get_subscription |
Plan tier, status, usage, billing period | read:profile |
list_sessions |
Sessions (Arena practice + NegoIQ real-world), filterable | read:sessions |
get_session |
One session incl. NegoIQ prep detail | read:sessions |
get_session_transcript |
Full conversation transcript | read:sessions |
get_session_analysis |
Post-session analysis, strategy comparison | read:sessions |
get_my_stats |
Arena aggregates: completed, avg score, wins/losses | read:analytics |
get_negoiq_stats |
NegoIQ aggregates + top vendors | read:analytics |
get_skill_breakdown |
Performance by difficulty, outcome, and focus | read:analytics |
list_companies / get_company |
Counterpart companies with contacts | read:companies |
create_company / update_company |
Create / partially update a company | write:companies |
delete_company |
Permanently delete a company | write:companies |
list_deals / get_deal |
Deals, filterable by company/readiness | read:deals |
create_deal / update_deal |
Create / partially update a deal | write:deals |
get_team / list_team_members |
Team overview and member stats | read:team |
list_team_sessions |
Team-wide sessions (admin/owner role required) | read:team |
list_webhooks |
Webhook subscriptions + delivery health | read:webhooks |
create_webhook |
Subscribe a URL to events (secret returned once) | write:webhooks |
update_webhook / delete_webhook / test_webhook |
Manage / ping subscriptions | write:webhooks |
Prompts
Reusable workflows exposed as MCP prompts (in Claude Desktop: the + / prompts menu):
analyze_recent_performance— coaching-style review of your recent sessions.prepare_for_negotiation— prep brief (anchor, BATNA, concession plan) for a deal or company.counterpart_brief— intelligence brief on a vendor: exposure, history, leverage.
Remote deployment (Streamable HTTP)
For remote use the server speaks Streamable HTTP at POST /mcp (stateless), with a health check at /healthz:
docker build -t tndr-mcp .
docker run -e TNDR_API_KEY=tndr_... -p 3100:3100 tndr-mcp
# Cloud Run
gcloud run deploy tndr-mcp --source . --set-env-vars TNDR_API_KEY=tndr_...
Security: the server performs no authentication of its own — anyone who can reach the port acts as the configured API key. Keep it on localhost, behind an authenticating proxy, or on a private network. One deployment = one Tndr user.
Troubleshooting
| Symptom | Fix |
|---|---|
| Every tool says "Tndr API key not configured" | Set TNDR_API_KEY in the host's env block and restart the host. |
| "API key was rejected" | Key revoked or mistyped — generate a new one in Settings → API Access. |
| "requires an Enterprise plan" | API access is Enterprise-only; upgrade or use an Enterprise account. |
| "lacks the 'write:…' scope" | Scopes are fixed at creation — create a new key with that scope ticked. |
| "rate limit exceeded" | 60 req/min (Enterprise) / 300 (Enterprise Plus). Wait for the stated retry time. |
| Server doesn't appear in the host | Check the host's MCP logs; run npx -y tndr-mcp manually — it should print running on stdio to stderr. |
Development
npm install
npm run build # tsc -> build/
npm test # unit + in-memory MCP end-to-end tests (node:test)
npm run smoke # spawns the built server over real stdio and exercises it
npm run smoke:http # same over Streamable HTTP
npm run dev # run from source (tsx)
Versioning follows the Platform API: 1.x of this package tracks /v1 of the API.