Zopaf

io.github.rjandinoPublished by GitHub account rjandinov1.0.0Updated Oct 24, 2026

Negotiation math engine. Pareto frontier, counteroffer generation, zero LLM tokens.

Overview

AI-generated overview

A negotiation math engine that lets an assistant model deal issues, generate Pareto-optimal counteroffers and infer counterpart priorities.

What you can do
Create and inspect negotiation sessions, adding issues and numeric ranges with scoring scales, recording preferences and BATNA alternatives to set leverage and weights. Generate three iso-utility counteroffers to present together. Process the counterpart's reaction to infer their priorities and produce a refined round-two offer. Score a specific deal against the Pareto frontier, showing value captured and suggested trades.
When to use it
Useful when an assistant is helping with a structured negotiation — job offers, term sheets, real estate, vendor contracts or settlements — and needs consistent, math-based packages and leverage-aware offers rather than improvised numbers. The assistant still runs the conversation; the server supplies the optimization.
Requirements
A remote Streamable HTTP endpoint; no local package, account, API key or environment variable is declared. The client must support Streamable HTTP transport, and network access to the hosted service is needed.
Before you install
Negotiation details you enter — issues, preferences, BATNA alternatives and counterpart reactions — are sent to a third-party hosted endpoint, so avoid confidential deal terms you cannot share. Sessions are created and updated on that remote service; there is no stated authentication, so anyone with the session identifier may reach the same state.

Installation

In SourceWeft

  1. Open Zopaf in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.rjandino%2Fzopaf/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "zopaf": {
      "type": "http",
      "url": "https://zopaf-mcp-production.up.railway.app/mcp"
    }
  }
}

README

Zopaf Negotiation Engine -- MCP Server

A negotiation math engine exposed as MCP tools that any AI agent can call. Zopaf computes Pareto frontiers, generates iso-utility counteroffers, and infers counterpart priorities from their reactions -- all through pure MILP optimization. Zero LLM tokens burned. The calling agent handles the conversation; Zopaf handles the math.

Quick Start

Claude Desktop

Add to your Claude Desktop configuration (claude_desktop_config.json):

json
{  "mcpServers": {    "zopaf": {      "type": "streamable-http",      "url": "https://zopaf-mcp-production.up.railway.app/mcp"    }  }}

Claude Code

bash
claude mcp add zopaf --transport streamable-http https://zopaf-mcp-production.up.railway.app/mcp

Generic MCP Client

Connect to the Streamable HTTP endpoint:

URL: https://zopaf-mcp-production.up.railway.app/mcpTransport: Streamable HTTP

Tools Reference

ToolDescription
create_sessionCreate a new negotiation session. Returns a session_id used by all other tools.
add_issueAdd a negotiable issue/term with options ordered worst to best for the user.
set_issue_rangeSet the acceptable range for a numeric issue, enabling 0-100 scoring.
record_preferenceRecord that the user prioritizes some issues over others. Updates the weight model.
set_batnaRecord the user's alternatives if the deal falls through. Determines leverage.
generate_counteroffersGenerate 3 iso-utility counteroffers to present simultaneously.
process_counterpart_responseProcess the counterpart's reaction to infer their priorities and generate a round-2 offer.
analyze_dealScore a specific deal against the Pareto frontier. Shows value captured and suggested trades.
get_negotiation_stateGet current model state: issues, weights, BATNA, frontier size, and recommended next step.

How It Works

  1. Create session -- Initialize a new negotiation model with create_session.

  2. Add issues -- Define the terms on the table with add_issue. Each issue includes options ordered worst to best for the user (e.g., Salary: ['$150K', '$160K', '$170K', '$180K']).

  3. Set ranges -- For numeric issues, call set_issue_range to map values onto a 0-100 scoring scale.

  4. Record preferences -- Call record_preference as you learn what the user cares about. Each call updates the internal weight model.

  5. Set BATNA -- Use set_batna to record alternatives. The number and quality determines leverage strength and anchoring strategy.

  6. Generate 3 counteroffers -- Call generate_counteroffers to produce three packages that are equally good for the user but structured differently. Present ALL THREE simultaneously. Never lead with one and fall back to another.

  7. Process counterpart response -- Call process_counterpart_response with which package they preferred and what they pushed back on. The engine infers their hidden priorities.

  8. Get round-2 offer -- Returns a refined offer on the efficient frontier, with value split weighted by leverage.

Example: Job Offer Negotiation

create_session-> {"session_id": "a1b2c3d4"}
add_issue(session_id="a1b2c3d4", issue_name="Salary", options=["$150K", "$160K", "$170K", "$180K"])add_issue(session_id="a1b2c3d4", issue_name="Equity", options=["0.1%", "0.25%", "0.5%", "0.75%"])add_issue(session_id="a1b2c3d4", issue_name="Signing Bonus", options=["$0", "$10K", "$20K", "$30K"])add_issue(session_id="a1b2c3d4", issue_name="Remote Work", options=["On-site", "Hybrid", "Fully Remote"])
set_issue_range(issue_name="Salary", worst_acceptable=150000, best_hoped=180000,    option_values={"$150K": 150000, "$160K": 160000, "$170K": 170000, "$180K": 180000})-> {"scores": {"$150K": 0.0, "$160K": 33.3, "$170K": 66.7, "$180K": 100.0}}
record_preference(preferred_issues=["Salary", "Equity"], over_issues=["Signing Bonus", "Remote Work"])-> {"learned_weights": {"Salary": 0.345, "Equity": 0.345, "Signing Bonus": 0.155, "Remote Work": 0.155}}
set_batna(alternatives=["Competing offer from Company B at $165K", "Stay in current role"])-> {"leverage_strength": "strong"}
generate_counteroffers(target_satisfaction="ambitious")-> {  "counteroffers": [    {"label": "A", "terms": {"Salary": "$180K", "Equity": "0.25%", "Signing Bonus": "$10K", "Remote Work": "On-site"}},    {"label": "B", "terms": {"Salary": "$170K", "Equity": "0.5%", "Signing Bonus": "$0", "Remote Work": "Hybrid"}},    {"label": "C", "terms": {"Salary": "$160K", "Equity": "0.75%", "Signing Bonus": "$20K", "Remote Work": "On-site"}}  ]}
process_counterpart_response(preferred_package="B", pushback_issues=["Equity"])-> {  "counterpart_priorities_inferred": {"Equity": 0.571, "Salary": 0.143, ...},  "round_2_offer": {"Salary": "$180K", "Equity": "0.25%", "Signing Bonus": "$20K", "Remote Work": "Hybrid"},  "value_split": "User gets 75% of surplus"}

The engine inferred that the counterpart cares most about equity (57% of their weight). The round-2 offer concedes on equity -- where it costs the user less -- and captures value on salary and signing bonus. Both sides improve. The user captures 75% of the surplus based on their strong BATNA.

Use Cases

  • Job offers -- Salary, equity, bonus, title, remote work, start date, PTO
  • VC term sheets -- Valuation, board seats, liquidation preferences, anti-dilution, pro-rata rights
  • Real estate -- Price, closing date, contingencies, repairs, inclusions, rent-back periods
  • Vendor contracts -- Price, SLA guarantees, payment terms, exclusivity, renewal clauses
  • Salary negotiations -- Base pay, bonus structure, review timeline, scope of role
  • Business partnerships -- Revenue split, IP ownership, decision rights, exit clauses, territory
  • Legal settlements -- Monetary terms, non-disclosure terms, admission of liability, timeline

Why Zero Tokens?

Zopaf is a math engine, not a language model. It runs MILP optimization and combinatorial scoring -- operations that are computationally cheap but tedious for an LLM to attempt in-context.

Your agent's LLM handles the conversation with the user, asks the right questions, and explains the strategy. Zopaf handles the optimization -- computing Pareto frontiers, generating iso-utility packages, solving preference weights from revealed choices, and positioning offers on the efficient frontier.

You bring the brain. Zopaf brings the calculator.

Source: README.md at commit a28f797

Tools

0
SourceWeft has not read this server's tools yet.

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

75% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.