Designed for fast, standards-based integration using A2A and MCP.
Requires the official A2A Python SDK (pip install a2a-sdk httpx, Python 3.10+).
import asyncio
import httpx
from a2a.client import ClientConfig, create_client
from a2a.helpers import new_text_message
from a2a.types.a2a_pb2 import GetTaskRequest, Role, SendMessageRequest, TaskState
API_KEY = "YOUR_API_KEY"
AGENT_BASE = "https://agent.supplygraph.ai/a2a/agents/tariff_calc"
TEXT = (
"Lithium-ion batteries for electric vehicles "
"manufactured in China"
)
TERMINAL = {
TaskState.TASK_STATE_COMPLETED,
TaskState.TASK_STATE_FAILED,
TaskState.TASK_STATE_CANCELED,
TaskState.TASK_STATE_REJECTED,
}
async def main() -> None:
headers = {"Authorization": f"Bearer {API_KEY}"}
async with httpx.AsyncClient(headers=headers, timeout=60.0) as http:
client = await create_client(
AGENT_BASE,
client_config=ClientConfig(streaming=False, httpx_client=http),
resolver_http_kwargs={"headers": headers},
relative_card_path="/",
)
try:
request = SendMessageRequest(
message=new_text_message(TEXT, role=Role.ROLE_USER),
)
task = None
async for chunk in client.send_message(request):
if chunk.HasField("task"):
task = chunk.task
if task is None:
print("No task returned.")
return
print(f"Task submitted: {task.id}")
while task.status.state not in TERMINAL:
await asyncio.sleep(3)
task = await client.get_task(GetTaskRequest(id=task.id))
print("Current status:", TaskState.Name(task.status.state))
if task.status.state == TaskState.TASK_STATE_COMPLETED:
print("Final result:")
print(task.artifacts)
else:
print("Task failed or cancelled.")
finally:
await client.close()
asyncio.run(main())
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.experimental.tasks.helpers import is_terminal
from mcp.types import CallToolResult
API_KEY = "YOUR_API_KEY"
MCP_URL = "https://mcp.supplygraph.ai/mcp"
async def main() -> None:
headers = {"Authorization": f"Bearer {API_KEY}"}
async with streamable_http_client(MCP_URL, headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
create = await session.experimental.call_tool_as_task(
"tariff_calc",
{
"text": (
"Lithium-ion batteries for electric vehicles "
"manufactured in China"
),
},
)
task_id = create.task.taskId
print(f"Task submitted: {task_id}")
async for status in session.experimental.poll_task(task_id):
print("Current status:", status.status)
if is_terminal(status.status):
break
result = await session.experimental.get_task_result(
task_id,
CallToolResult,
)
if result.isError:
print("Task failed or cancelled.")
else:
print("Final result:")
print(result.content)
asyncio.run(main())