satishkamavaram/a2a-aws-strands-mcp
If you are the rightful owner of a2a-aws-strands-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
This document provides a comprehensive overview of a Model Context Protocol (MCP) server, detailing its features, tools, resources, usage, and frequently asked questions.
⚠️ POC DISCLAIMER: This is a Proof of Concept (POC) implementation. Please do not evaluate this code for production-level code structure, modularity, or best practices. This project is designed for educational and demonstration purposes only.
a2a-aws-strands-mcp
Table of contents
- Prerequisites
- Start the MCP server (port 8001)
- Start the A2A agent server (port 10001)
- Run a client
- Troubleshooting
- Project layout (key parts)
A minimal agent system that lets you ask questions about:
- Weather alerts for German states
- Jira tickets assigned to a user (and lookup email by user ID)
- Creating appointments
It consists of:
- An MCP server exposing tools (weather, Jira, appointments) over Streamable-HTTP
- An A2A agent server that uses those MCP tools to answer your queries
- Simple A2A clients (streaming and non‑streaming)
Protocol/stack:
- MCP (FastMCP), Google A2A SDK, AWS Strands agents
Prerequisites
- Python 3.10+
- An OpenAI API key (for the A2A server)
Create a .env file at the project root with:
OPENAI_API_KEY=your_openai_api_key
1) Start the MCP server (port 8001)
From the a2a-aws-strands-mcp/mcp folder:
# Create and activate a virtual environment (macOS zsh)
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run the MCP server (defaults to http://127.0.0.1:8001)
python mcp_server.py
Example session output will show something like:
satish@Satishs-MacBook-Air mcp % python mcp_server.py
INFO:root:Server received API_KEY: None
INFO:root:Server received config path: None
╭────────────────────────────────────────────────────────────────────────────╮
│ │
│ _ __ ___ _____ __ __ _____________ ____ ____ │
│ _ __ ___ .'____/___ ______/ /_/ |/ / ____/ __ \ |___ \ / __ \ │
│ _ __ ___ / /_ / __ `/ ___/ __/ /|_/ / / / /_/ / ___/ / / / / / │
│ _ __ ___ / __/ / /_/ (__ ) /_/ / / / /___/ ____/ / __/_/ /_/ / │
│ _ __ ___ /_/ \____/____/\__/_/ /_/\____/_/ /_____(*)____/ │
│ │
│ │
│ FastMCP 2.0 │
│ │
│ │
│ 🖥️ Server name: jira MCP Server │
│ 📦 Transport: Streamable-HTTP │
│ 🔗 Server URL: http://127.0.0.1:8001/mcp │
│ │
│ 🏎️ FastMCP version: 2.12.0 │
│ 🤝 MCP SDK version: 1.19.0 │
│ │
│ 📚 Docs: https://gofastmcp.com │
│ 🚀 Deploy: https://fastmcp.cloud │
│ │
╰────────────────────────────────────────────────────────────────────────────╯
[10/26/25 11:10:44] INFO Starting MCP server 'jira MCP Server' with transport 'http' on http://127.0.0.1:8001/mcp server.py:1571
INFO: Started server process [70190]
INFO: Waiting for application startup.
INFO:mcp.server.streamable_http_manager:StreamableHTTP session manager started
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)
2) Start the A2A agent server (port 10001)
From the a2a-aws-strands-mcp/a2a-server folder:
# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Ensure repo-root .env includes your OpenAI key
# OPENAI_API_KEY=your_openai_api_key
# Start the A2A agent server (http://0.0.0.0:10001)
python a2a_jira_server.py
You should see logs like:
satish@Satishs-Air a2a-server % python a2a_jira_server.py
app_url:::::http://0.0.0.0:10001
:::::::api_key:::: {your_openapi_key}
::::::::::::::::::initializing agent
agent card:::::additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'
agent a2a_app:::::<a2a.server.apps.jsonrpc.starlette_app.A2AStarletteApplication object at 0x114eaa3c0>
INFO: Started server process [77834]
INFO: Waiting for application startup.
auth agent card:::::additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:10001 (Press CTRL+C to quit)
Agent card (for quick sanity check):
3) Run a client
From the a2a-aws-strands-mcp/a2a-client folder:
# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run a client
# Non‑streaming
python a2a_jira_client.py
# Streaming
python a2a_jira_client_stream.py
Example interaction (non‑streaming):
satish@Satishs-Air a2a-client % python a2a_jira_client.py
Welcome to the A2A client!
Please enter your query (type 'exit' to quit):
Resolved jira agent card: additional_interfaces=None capabilities=AgentCapabilities(extensions=None, push_notifications=None, state_transition_history=None, streaming=True) default_input_modes=['text'] default_output_modes=['text'] description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments' documentation_url=None icon_url=None name='Jira Agent' preferred_transport='JSONRPC' protocol_version='0.3.0' provider=None security=None security_schemes={'oauth2': SecurityScheme(root=OAuth2SecurityScheme(description='', flows=OAuthFlows(authorization_code=None, client_credentials=ClientCredentialsOAuthFlow(refresh_url=None, scopes={'read:test': 'Allows confirming'}, token_url='https://localhost:8080/oauth/token'), implicit=None, password=None), oauth2_metadata_url=None, type='oauth2'))} signatures=None skills=[AgentSkill(description='You are a Jira assistant agent. You can fetch Jira tickets assigned to a user by email and retrieve email IDs for given user IDs. Answer user queries about Jira tickets and user emails using the available tools. You can create appointments', examples=['jira tickets assigned to 1234', 'schedule a appointment on 4th sept 2026 at 4:30 am from email satish.k@test.com and to these users test1@test.com test2@test.com to discuss about future of agentic AI'], id='jira_agent', input_modes=None, name='Jira Agent', output_modes=None, security=None, tags=['jira'])] supports_authenticated_extended_card=None url='http://0.0.0.0:10001' version='1.0.0'
User Query: hi
last_context_id:::: 5001c765e2654ff6b87cb17aee45b913
Request payload JSON:
{
"message": {
"role": "user",
"parts": [
{
"type": "text",
"text": "hi"
}
],
"message_id": "4392739370b74f46ac38e3aebdd121d1",
"metadata": {
"max_tokens": 100
},
"context_id": "5001c765e2654ff6b87cb17aee45b913"
}
}
Response from jira agent (JSON):
{
"id": "aa873471a9bd4a218962a385d5ae0f7b",
"jsonrpc": "2.0",
"result": {
"artifacts": [
{
"artifactId": "4fa62c7e-8794-40bc-8f3d-eb6e6b74b02d",
"description": "Results of agent",
"name": "current_result",
"parts": [
{
"kind": "text",
"text": "Hello! How can I assist you today?"
}
]
}
],
"contextId": "5001c765e2654ff6b87cb17aee45b913",
"history": [
{
"contextId": "5001c765e2654ff6b87cb17aee45b913",
"kind": "message",
"messageId": "4392739370b74f46ac38e3aebdd121d1",
"metadata": {
"max_tokens": 100
},
"parts": [
{
"kind": "text",
"text": "hi"
}
],
"role": "user",
"taskId": "5234b99b-72db-491a-a8f1-1a837a38ef6a"
}
],
"id": "5234b99b-72db-491a-a8f1-1a837a38ef6a",
"kind": "task",
"status": {
"state": "completed"
}
}
}
context_id=5001c765e2654ff6b87cb17aee45b913, task_id=5234b99b-72db-491a-a8f1-1a837a38ef6a
Answer: Hello! How can I assist you today?
Troubleshooting
- If the client can’t resolve the agent card, ensure the A2A server is running on port 10001.
- If tools aren’t available, ensure the MCP server is running on port 8001.
- Ensure your
.envhas a validOPENAI_API_KEYbefore starting the A2A server.
Project layout (key parts)
a2a-aws-strands-mcp/mcp/– MCP server and its requirementsa2a-aws-strands-mcp/a2a-server/– A2A agent server (uses OpenAI + MCP tools)a2a-aws-strands-mcp/a2a-client/– Clients (streaming and non‑streaming)