MURA SDK
Python SDK for the MURA Supply Chain Agent Network. Enable AI agents to coordinate procurement, logistics, and compliance.
For Platforms
Use MuraClient to power your procurement with MURA's agent network
For Suppliers
Use SupplierAgent to join the network and receive RFQs automatically
Built on NANDA — MURA implements concepts from MIT Media Lab's NANDA research for agent coordination.
Installation
1pip install mura-sdk
Requires Python 3.10+
Quick Start
For Platforms
1from mura import MuraClient23client = MuraClient(api_key="mura_live_xxx")45result = client.procure(6 request="500 temperature sensors",7 budget=5000,8 destination_region="EU"9)1011print(result.recommendation.recommended_supplier)
For Suppliers
1from mura import SupplierAgent23agent = SupplierAgent(4 name="Acme Electronics",5 capabilities=["electronics", "sensors"],6 region="EU"7)89agent.add_to_catalog("temperature_sensor", 5.50, "sensors")10agent.register()11agent.run()
MuraClient
The main client for platforms to use MURA as supply chain infrastructure.
1from mura import MuraClient23client = MuraClient(4 api_key="mura_live_xxx", # Your API key5 base_url="https://mura-production.up.railway.app", # Optional6 timeout=120.0 # Request timeout7)
Parameters
| Name | Type | Description |
|---|---|---|
| api_key | str | Your MURA API key |
| base_url | str | API base URL (optional) |
| timeout | float | Request timeout in seconds (default: 120) |
client.procure(request, budget=None, deadline_days=7, destination_region='EU') → ProcurementResultRun the full procurement workflow: BOM → discovery → quoting → compliance → logistics → recommendation.
1result = client.procure(2 request="Build me a racing drone",3 budget=1000,4 deadline_days=14,5 destination_region="EU"6)78# Access results9result.bom # Bill of Materials10result.quotes # All quotes11result.compliance # Compliance result12result.logistics # Shipping plan13result.recommendation # Final recommendation
Parameters
| Name | Type | Description |
|---|---|---|
| request* | str | Natural language procurement request |
| budget | float | Budget constraint in EUR |
| deadline_days | int | Delivery deadline (default: 7) |
| destination_region | str | Destination: EU, US, Asia |
async client.procure_stream(request, ...) → AsyncGenerator[dict]Stream procurement with real-time updates. Perfect for live UI progress.
1async for step in client.procure_stream("500 sensors"):2 print(f"[{step['agent']}] {step['message']}")34 if step.get('phase') == 'complete':5 result = step.get('data')
Step Object
{
"agent": "compliance",
"message": "Checking EU regulations...",
"phase": "compliance",
"progress": 0.7
}client.registry.discover(role=None, capability=None, region=None, min_trust=0.0) → List[AgentFacts]Discover agents in the MURA network.
1from mura import AgentRole23suppliers = client.registry.discover(4 role=AgentRole.SUPPLIER,5 capability="electronics",6 region="EU",7 min_trust=0.88)910for s in suppliers:11 print(f"{s.name}: {s.trust.reputation_score}")
client.quotes.get_quote(supplier_id, items, deadline_days=None) → dict1quote = client.quotes.get_quote(2 supplier_id="supplier-abc123",3 items=[4 {"part_name": "temperature_sensor", "quantity": 100},5 {"part_name": "humidity_sensor", "quantity": 50}6 ]7)89print(f"Total: €{quote['total_cost']}")
client.compliance.check(items, destination_region, transport_type='air') → dict1result = client.compliance.check(2 items=[{"part_name": "battery_li_ion", "category": "electronics"}],3 destination_region="EU",4 transport_type="air"5)67print(f"Status: {result['status']}") # passed, warning, failed
client.logistics.plan(origin_region, destination_region, items, deadline_days=None) → dict1plan = client.logistics.plan(2 origin_region="Asia",3 destination_region="EU",4 items=[{"weight_kg": 5}],5 deadline_days=76)78print(f"Provider: {plan['provider']}, Cost: €{plan['shipping_cost']}")
SupplierAgent
Join the MURA network as a supplier to receive RFQs and respond with quotes.
1from mura import SupplierAgent23agent = SupplierAgent(4 name="Acme Electronics",5 capabilities=["electronics", "sensors", "MCUs"],6 region="EU",7 country="Germany",8 certifications=[9 {"authority": "ISO", "certification": "9001"},10 ],11 max_discount_pct=15.0,12 lead_time_days=513)
Parameters
| Name | Type | Description |
|---|---|---|
| name* | str | Your company name |
| capabilities* | List[str] | What you supply |
| region* | str | Your region: EU, US, Asia |
| country | str | Your country |
| certifications | List[dict] | Your certifications |
Catalog Management
1# Add items to catalog2agent.add_to_catalog(3 part_name="temperature_sensor",4 unit_price=5.50,5 category="sensors",6 stock=1000,7 lead_time_days=38)910# Load from JSON file11agent.load_catalog_from_json("catalog.json")1213# Load from dictionary14agent.load_catalog_from_dict({15 "esp32": {"unit_price": 8.0, "category": "MCUs", "stock": 500}16})
Custom RFQ Handler
Connect to your ERP/inventory system with a custom handler.
1from mura import Quote, QuoteItem23@agent.on_rfq4def handle_rfq(rfq):5 items = []67 for item in rfq.items:8 price = my_erp.get_price(item.part_name)9 if price is None:10 continue1112 items.append(QuoteItem(13 part_name=item.part_name,14 unit_price=price,15 quantity=item.quantity,16 total_price=price * item.quantity,17 lead_time_days=3,18 in_stock=True19 ))2021 return Quote(22 supplier_id=agent.agent_id,23 supplier_name=agent.name,24 region=agent.region,25 items=items,26 total_cost=sum(i.total_price for i in items),27 currency="EUR",28 lead_time_days=max(i.lead_time_days for i in items)29 )3031agent.register()32agent.run()
Models
1from mura import (2 # Agent Identity (NANDA)3 AgentFacts,4 TrustProfile,5 Certification,67 # Procurement8 BOMItem,9 BillOfMaterials,10 Quote,11 QuoteItem,12 RFQ,1314 # Results15 ProcurementResult,16 ComplianceResult,17 LogisticsPlan,18 Recommendation,19)
Enums
1from mura import TrustLevel, AgentRole, ComplianceStatus23# Trust Levels (ZTAA)4TrustLevel.SELF_DECLARED # Agent claims capabilities5TrustLevel.PEER_ATTESTED # Other agents vouch6TrustLevel.AUTHORITY_VERIFIED # Official verification78# Agent Roles9AgentRole.SUPPLIER10AgentRole.LOGISTICS11AgentRole.COMPLIANCE12AgentRole.BUYER1314# Compliance Status15ComplianceStatus.PASSED16ComplianceStatus.WARNING17ComplianceStatus.FAILED
Error Handling
1from mura import (2 MuraError, # Base exception3 MuraConnectionError, # Network issues4 MuraAuthenticationError, # Invalid API key5 NoSuppliersFoundError, # No matching suppliers6 ComplianceError, # Compliance blockers7)89try:10 result = client.procure("dangerous goods")11except ComplianceError as e:12 print(f"Blocked: {e.blockers}")13except NoSuppliersFoundError:14 print("No suppliers available")