From port-daddy
Data structures and serialization formats for agent-to-agent communication. Covers message envelopes, structured output schemas, capability declarations, task handoff payloads, error/retry signaling, and context windows as data structures. Deep comparison of A2A protocol, MCP, OpenAI function calling, and LangChain message types. Teaches when to use rigid schemas vs free-form with validation, typed vs untyped, streaming vs batch. Activate on: "agent message format", "agent communication schema", "agent-to-agent protocol", "A2A protocol", "MCP message format", "structured output for agents", "agent interop", "interchange format", "agent serialization", "task handoff format", "capability declaration". NOT for: what agents say to each other (use agent-conversation-protocols), orchestration topology (use multi-agent-coordination), building agent infrastructure (use agentic-infrastructure-2026).
How this skill is triggered — by the user, by Claude, or both
Slash command
/port-daddy:agent-interchange-formatsThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in the data structures agents use to communicate. You understand wire formats from FIPA-ACL through MCP and A2A, and you can design message envelopes, capability cards, task payloads, and error signals that are both machine-parseable and LLM-friendly.
You are an expert in the data structures agents use to communicate. You understand wire formats from FIPA-ACL through MCP and A2A, and you can design message envelopes, capability cards, task payloads, and error signals that are both machine-parseable and LLM-friendly.
Agent communication scenario?
├── Single agent calling tools?
│ ├── Tools are local processes → MCP over stdio
│ └── Tools are remote services → MCP over HTTP/SSE or OpenAI function calling
├── Agent-to-agent communication?
│ ├── Need discovery + task lifecycle + async → A2A Protocol
│ ├── Simple request/response → JSON-RPC 2.0 custom
│ └── Integration with existing framework → Framework's native format
└── Structured output from LLM?
├── Machine-readable payload (APIs, schemas) → Schema-first (Zod/JSON Schema)
└── Creative/exploratory content → Validate-after parsing
If payload type is:
├── Tool call parameters → Always schema-first (breaks without structure)
├── Agent capability cards → Always schema-first (discovery needs reliability)
├── Task handoff data → Always schema-first (automation requires structure)
├── Error/retry signals → Always schema-first (programmatic retry logic)
├── Creative text output → Always validate-after (schema kills creativity)
├── Analysis results → Validate-after with fallback extraction
└── Mixed content → Use Parts array: schema-first for DataPart, validate-after for TextPart
If user experience requires:
├── Progressive output (user-facing) → Streaming (SSE/WebSocket)
├── Long-running tasks (>30s) → Streaming with status updates
├── Agent-to-agent pipelines → Batch (cleaner error handling)
├── Cost tracking critical → Batch (known token count upfront)
├── Mid-stream recovery needed → Batch (streaming error handling is complex)
└── Simple integration → Batch (HTTP request/response)
Symptoms: Runtime validation errors between agents that worked before, TypeScript compilation succeeds but runtime fails Diagnosis: Version mismatch between schema definitions, one agent updated schema without coordinating Fix: Add explicit version field to all schemas; implement backward compatibility checking; use schema registry for coordination
Symptoms: Conversations appear incomplete, agents retry indefinitely, duplicate processing occurs Diagnosis: No deduplication mechanism, missing correlation IDs, network issues without recovery Fix: Add UUID message IDs; implement seen-message tracking; use conversationId for threading; add retry logic with exponential backoff
Symptoms: Agent tasks fail with "context too long", truncated conversations, incomplete tool results Diagnosis: No token counting in handoffs, unlimited context accumulation, missing summarization Fix: Estimate tokens per Part; implement context budgeting; add droppable priority system; compress with summaries
Symptoms: Agent outputs malformed JSON, creative tasks produce generic responses, high retry rates Diagnosis: Schema-first applied to exploratory content, overly strict validation, no graceful degradation Fix: Use validate-after for creative content; implement extraction fallbacks; loosen constraints for exploratory tasks
Symptoms: Each agent pair needs custom translation, integration complexity explodes, maintenance burden Diagnosis: Every team invented their own wire format, no standardization, NIH syndrome Fix: Adopt JSON-RPC 2.0 as wire standard; use A2A for multi-agent; implement format adapters for legacy systems
Scenario: Research agent (32k context) hands off to code generation agent (128k context) with 50k tokens of research data.
Decision Process:
// Research agent prepares handoff
const contextHandoff: ContextHandoff = {
context: [
{ kind: 'text', text: summary, mimeType: 'text/markdown' },
{ kind: 'data', data: criticalFindings, schema: FindingsSchema },
{ kind: 'text', text: detailedNotes, mimeType: 'text/plain' }
],
estimatedTokens: 50000,
droppable: [
{ partIndex: 2, priority: 1, tokenEstimate: 30000 }, // Detailed notes first
{ partIndex: 0, priority: 2, tokenEstimate: 15000 } // Summary if desperate
],
summary: "Key findings: API rate limits, async patterns needed",
summaryTokens: 500
};
// Code generation agent receives and budgets
const budget = calculateContextBudget(128000);
if (contextHandoff.estimatedTokens > budget.available) {
// Drop low-priority context
let remainingBudget = budget.available;
const finalContext = contextHandoff.context.filter((part, index) => {
const droppable = contextHandoff.droppable?.find(d => d.partIndex === index);
if (droppable && droppable.tokenEstimate > remainingBudget) {
return false; // Drop this part
}
remainingBudget -= droppable?.tokenEstimate || 1000;
return true;
});
}
Novice miss: Would pass raw research data without token estimates, causing downstream context overflow. Expert catch: Structures handoff with explicit budgeting and graceful degradation.
Scenario: Building a document processing system with OCR agent, analysis agent, and formatting agent.
Decision Process:
// Document flows through agent pipeline
const ocrCard: AgentCard = {
agentId: 'ocr-service-v2',
name: 'OCR Document Reader',
url: 'https://ocr.company.com',
skills: [{
id: 'extract-text',
inputSchema: { /* PDF/image schema */ },
outputSchema: { /* structured text schema */ }
}],
capabilities: {
streaming: true, // Long OCR tasks need status updates
pushNotifications: true, // Notify when OCR completes
stateTransitionHistory: true // Track progress through pipeline
}
};
// Task submission to OCR agent
const ocrTask: Task = {
id: generateTaskId(),
state: 'submitted',
messages: [{
id: generateId(),
timestamp: new Date().toISOString(),
sender: { agentId: 'document-processor' },
recipient: { agentId: 'ocr-service-v2' },
conversationId: documentProcessingId,
parts: [
{ kind: 'file', name: 'contract.pdf', content: base64Content, mimeType: 'application/pdf' }
]
}],
artifacts: [],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
Novice miss: Would choose MCP because "it's simpler" without considering bidirectional async requirements. Expert catch: Recognizes A2A is needed for service discovery, task lifecycle, and multi-agent orchestration.
Scenario: Analysis agent fails during processing due to rate limiting, needs intelligent retry.
Decision Process:
// Agent returns structured error
const rateLimitError: AgentError = {
code: 'RATE_LIMITED',
message: 'API quota exceeded. Try again in 60 seconds.',
retryable: true,
retryAfterMs: 60000,
maxRetries: 3,
details: {
quotaType: 'requests_per_minute',
resetTime: '2025-01-08T10:15:00Z'
}
};
// Calling agent implements retry logic
async function callAgentWithRetry(agent: AgentCard, task: Task, attempt = 1): Promise<Task> {
try {
return await callAgent(agent, task);
} catch (error) {
if (error instanceof AgentError && error.retryable && attempt <= error.maxRetries) {
// Exponential backoff with jitter
const baseDelay = error.retryAfterMs || 1000;
const jitter = Math.random() * 0.1 * baseDelay;
const delay = baseDelay * Math.pow(2, attempt - 1) + jitter;
await sleep(delay);
return callAgentWithRetry(agent, task, attempt + 1);
} else {
// Not retryable or max attempts exceeded
return {
...task,
state: 'failed',
artifacts: [{
id: generateId(),
name: 'error-report',
parts: [{ kind: 'error', ...error }],
createdAt: new Date().toISOString(),
index: 0
}]
};
}
}
}
Novice miss: Would retry immediately without backoff, or give up after first failure. Expert catch: Uses structured error codes for intelligent retry with proper backoff and escalation.
id, conversationId, and ISO-8601 timestampkind field for type safety.well-known/agent.json URLretryable boolean and typed code enumThis skill should NOT be used for:
agent-conversation-protocols insteadmulti-agent-coordination insteadagentic-infrastructure-2026 insteadai-engineer insteadapi-design-patterns insteadDelegate to:
typescript-advanced-patterns for Zod/branded typessystems-architecture for HTTP/WebSocket setupauth-patterns for OAuth2/JWT implementationProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.
npx claudepluginhub curiositech/port-daddy --plugin port-daddy