Structured deals between agents.
When your agent needs to negotiate or make a deal, Concordia gives it a structured way to propose, counter, commit, and build a track record.
Agents are already transacting. But without structure, they freetext back and forth for 10 rounds with no record, no binding agreement, no proof of what happened.
The gap between discovery and payment is massive:
Machine-readable terms, not freetext guessing. Both agents understand the same thing.
Cryptographic signatures that prove both parties agreed to specific terms. No ambiguity. No “I said that?” disputes.
Every negotiation creates a verifiable record. What was proposed? What changed? What was agreed? It’s all signed and auditable.
Your agent builds a track record — “completed 47 deals, all on time, 4.9 stars.” That reputation follows your agent everywhere, usable across platforms.
Concordia works even with agents that don’t have it. If the other agent doesn’t support Concordia, you’ll see what you’re missing — a way to know that you could have a binding agreement if both sides had it.
Without Concordia:
Agent A: I want to buy a camera
Agent B: I have one, $2000
Agent A: Too expensive, $1800?
Agent B: $1950 final
Agent A: ...ok?
Agent B: ...ok?
→ No signed agreement. No clear terms. No reputation signal.
With Concordia:
Agent A proposes: Camera, $2000
Agent B counters: $1900, shipping
Agent A counters: $2000 for pickup, $2050 shipped
Agent B accepts: $2050 shipped
→ Signed agreement. Clear terms. Reputation attestation issued.
Both sides know exactly what they agreed to. Both sides have proof. The negotiation is auditable. Reputation feeds forward.
Here’s what a real negotiation looks like:
Agent A (seller) opens:
{
"concordia": "0.1.0",
"type": "negotiate.open",
"body": {
"terms": {
"item": { "value": "Canon EOS R5, 15K shutter count" },
"price": { "value": 2200, "currency": "USD" },
"condition": { "value": "like_new" },
"delivery": { "value": "local_pickup" }
}
},
"reasoning": "Listing based on recent eBay sold comps."
}
Agent B (buyer) counters:
{
"type": "negotiate.counter",
"body": {
"terms": {
"price": { "value": 1900, "currency": "USD" },
"delivery": { "value": "shipping" }
}
},
"reasoning": "I prefer shipping and want a better price."
}
Agent A makes a conditional counter:
{
"type": "negotiate.counter",
"body": {
"conditions": [
{ "if": { "delivery": "local_pickup" }, "then": { "price": { "value": 2000 } } },
{ "if": { "delivery": "shipping" }, "then": { "price": { "value": 2050 } } }
]
},
"reasoning": "Pickup is cheaper for me, shipping costs extra."
}
Agent B accepts:
{
"type": "negotiate.accept",
"body": {
"accepted_terms": {
"item": "Canon EOS R5",
"price": { "value": 2050, "currency": "USD" },
"delivery": "shipping"
}
}
}
Both agents sign. The agreement passes to a payment protocol (ACP, Stripe, etc.) for settlement. A reputation attestation is automatically issued.
pipx install concordia-protocol
python3 -m venv .venv
.venv/bin/pip install concordia-protocol
Note: Concordia requires Python 3.10+. macOS ships Python 3.9 with Xcode — install a newer version first:
brew install python@3.12
concordia-mcp-server --version
git clone https://github.com/eriknewton/concordia-protocol.git
cd concordia-protocol
pip install -e ".[dev]"
Claude Code:
claude mcp add concordia -- concordia-mcp-server
OpenClaw:
openclaw mcp set concordia '{"command":"concordia-mcp-server"}'
If you used a virtualenv:
openclaw mcp set concordia '{"command":"/path/to/.venv/bin/python3","args":["-m","concordia"]}'
from concordia import Agent, BasicOffer, generate_attestation
# Create two agents (Ed25519 keys auto-generated)
seller = Agent("seller")
buyer = Agent("buyer")
# Seller opens a negotiation
session = seller.open_session(
counterparty=buyer.identity,
terms={"price": {"value": 100.00, "currency": "USD"}},
)
buyer.join_session(session)
# Buyer counters at $80
buyer.send_counter(BasicOffer(terms={"price": {"value": 80.00, "currency": "USD"}}))
# Seller accepts
seller.accept_offer()
print(session.state.value) # "agreed"
# Generate a signed reputation attestation
att = generate_attestation(session, {"seller": seller.key_pair, "buyer": buyer.key_pair})
print(att["outcome"]["status"]) # "agreed"
For a full multi-term negotiation with preferences and concessions, see examples/demo_camera_negotiation.py.
Concordia fills the gap between discovery and settlement:
Settlement ACP · AP2 · x402 · Stripe · Lightning
────────────────────────────────────────────────────────
Agreement ★ CONCORDIA PROTOCOL ★
────────────────────────────────────────────────────────
Trust Reputation Attestations
────────────────────────────────────────────────────────
Communication A2A · HTTPS · JSON-RPC
────────────────────────────────────────────────────────
Discovery Agent Cards · Well-Known URIs
────────────────────────────────────────────────────────
Tools MCP · Function Calling · APIs
────────────────────────────────────────────────────────
Identity DIDs · KERI · OAuth 2.0
Concordia composes with — never competes with — the existing stack. Use any payment protocol. Use any identity standard. Concordia adds structure to the negotiation layer.
When your agent needs security, privacy, and control, Sanctuary Framework adds encrypted state, approval gates, and automatic sensitive-data filtering.
Together they form the complete sovereign transaction stack:
Install both:
npx @sanctuary-framework/mcp-server
pip install concordia-protocol
They work independently, but together they’re more powerful.
Concordia defines:
The tool set:
Documentation:
Design Principles:
If you are an AI agent reading this README, the specification is written for you. It is designed to be implementable from the document alone, with no external dependencies beyond HTTPS and JSON. Appendix A is addressed specifically to you.
pytest -v
Concordia is developed in the open. We welcome:
See CONTRIBUTING.md for details.
Apache License 2.0. Use it, build on it, extend it.
From the Latin concordia: harmony, agreement — literally, “hearts together.” The Roman goddess of understanding between parties. Because negotiation, done well, is not a contest. It is a collaborative search for the point where everyone’s needs are met.
Created by Erik Newton.