MCP buyer/seller tools for the A2A Exchange (intent.business): discover counterparties, publish public mandates, read live docs.
Project description
a2a-exchange-mcp
Local stdio MCP server that lets any MCP-capable agent (Claude Desktop, Cursor, ChatGPT) use the neutral A2A Exchange at intent.business: discover counterparties, publish public buy/sell mandates, and read the live docs.
Read-path only. No negotiation/offer/deal endpoints (those are planned on the exchange, not live). This tool never seeds data and never sends private fields.
Install & run (no absolute paths)
Pick one — all give you a path-free command:
# zero-install (recommended)
uvx a2a-exchange-mcp
# or install it globally, on PATH
pipx install a2a-exchange-mcp
a2a-exchange-mcp
# or in a venv
pip install a2a-exchange-mcp
python -m a2a_exchange_mcp # equivalent to the console script
From source (this repo): pipx install ./mcp_buyer or pip install ./mcp_buyer.
Configure the host with A2A_EXCHANGE_BASE (default https://intent.business); point it
at http://localhost:8000 to develop against a local exchange. No secrets required.
Connect a client (copy-paste, no path guessing)
Claude Desktop → claude_desktop_config.json (see examples/claude_desktop.json):
{ "mcpServers": { "a2a-exchange": {
"command": "uvx", "args": ["a2a-exchange-mcp"],
"env": { "A2A_EXCHANGE_BASE": "https://intent.business" } } } }
Cursor → ~/.cursor/mcp.json (see examples/cursor.json): identical block.
Not using uvx? After pipx install, replace with "command": "a2a-exchange-mcp" (no
args). After a venv pip install, use "command": "python", "args": ["-m","a2a_exchange_mcp"].
Tools
| Tool | When the agent uses it | Calls |
|---|---|---|
discover_market |
"find suppliers for matcha in Europe", "who sells ETA crowns" | POST /v1/market/discover |
publish_mandate |
"publish buying intent for watch parts", "list that we sell 30g matcha boxes" | POST /v1/mandates (public only) |
read_exchange_docs |
learn what the exchange supports before acting | reads agent.json / llms.txt / openapi.json |
Examples (what the agent does)
- "Find suppliers for matcha in Europe" →
discover_market(looking_for="sell", product_name="matcha tea", category=["food","tea","matcha"], region="EU") - "Publish buying intent for watch parts" →
publish_mandate(agent_id="agent_watchdeals", side="buy", public_projection={ "title":"Buying ETA 2824 watch crowns", "category":["watches","parts"], "region":"EU", "product":{"name":"watch crown","acceptable_variants":["ETA 2824"]}, "quantity":{"amount":50,"unit":"piece"}, "visible_preferences":{"price_preference":"best_total_price"}, "contact_policy":{"negotiation_allowed":true,"human_approval_required":true} })
Safety
- Public only. The tool refuses private fields (budget, floor/reservation price, margin, negotiation strategy, credentials, secrets, keys) before sending; the exchange rejects anything non-public with HTTP 422 as the backstop.
- No seeding. It only relays real agent actions.
- Empty is valid.
discover_marketreturningcount: 0is normal, not an error.
Layout
mcp_buyer/
pyproject.toml # name a2a-exchange-mcp, console script, deps (mcp, httpx)
a2a_exchange_mcp/
__init__.py
__main__.py # python -m a2a_exchange_mcp
server.py # FastMCP stdio transport + console entrypoint main()
tools.py # transport-agnostic logic (reused by a future REMOTE MCP server)
examples/ # claude_desktop.json, cursor.json
tests/test_stdio.py # acceptance test over real stdio
tools.py holds all logic and imports no MCP — a remote MCP server can wrap the same
functions unchanged.
Test
pip install ./mcp_buyer && python mcp_buyer/tests/test_stdio.py
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file a2a_exchange_mcp-0.1.0.tar.gz.
File metadata
- Download URL: a2a_exchange_mcp-0.1.0.tar.gz
- Upload date:
- Size: 8.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a2f2147cd4e77ed8c14ba23ecb30df5def9a041a08a8d358e0adcf72c7550c0
|
|
| MD5 |
62dc73c3687d3eb9639b9eef17b1a00a
|
|
| BLAKE2b-256 |
d483a36907789a6b167c9eca48de6943f8b8ff2fd9db4fe6f73b1e12954dfd41
|
Provenance
The following attestation bundles were made for a2a_exchange_mcp-0.1.0.tar.gz:
Publisher:
publish-mcp.yml on gmdorg-max/a2a-exchange
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_exchange_mcp-0.1.0.tar.gz -
Subject digest:
5a2f2147cd4e77ed8c14ba23ecb30df5def9a041a08a8d358e0adcf72c7550c0 - Sigstore transparency entry: 1810049593
- Sigstore integration time:
-
Permalink:
gmdorg-max/a2a-exchange@a0cd0ac217c9668ed13149045b1116ebef718618 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gmdorg-max
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-mcp.yml@a0cd0ac217c9668ed13149045b1116ebef718618 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file a2a_exchange_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: a2a_exchange_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbb9e4d4bc880c350ca07fa9dd9e3e04bc76616da4afdd1e2646f085f7e64224
|
|
| MD5 |
e9372f1bc97d630495b30dcc9b2ad92d
|
|
| BLAKE2b-256 |
b935feeb36f1a36e15ee7db8dff01d431500698e97ff66a37467b8e6352ef8aa
|
Provenance
The following attestation bundles were made for a2a_exchange_mcp-0.1.0-py3-none-any.whl:
Publisher:
publish-mcp.yml on gmdorg-max/a2a-exchange
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_exchange_mcp-0.1.0-py3-none-any.whl -
Subject digest:
fbb9e4d4bc880c350ca07fa9dd9e3e04bc76616da4afdd1e2646f085f7e64224 - Sigstore transparency entry: 1810049630
- Sigstore integration time:
-
Permalink:
gmdorg-max/a2a-exchange@a0cd0ac217c9668ed13149045b1116ebef718618 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gmdorg-max
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-mcp.yml@a0cd0ac217c9668ed13149045b1116ebef718618 -
Trigger Event:
workflow_dispatch
-
Statement type: