We use specialized workflow tools instead of 30+ API-endpoint tools.
Traditional (API-centric): add-project, update-project, delete-project, get-project...
Our approach (workflow-centric): add-projects, update-projects, delete-object (universal deletion)
- User Intent Over API Structure - Match workflows, not API organization
- Batch Operations - Support multiple items when logical (
add-taskstakes array) - Explicit Intent - Clear action verbs (
add-projectsvsupdate-projectsfor explicit operations) - Context-Aware Responses - Provide next-step suggestions after operations
- Universal Patterns - Unify similar operations (
delete-objecthandles all entity types)
// Explicit tools for specific operations
// add-projects: creates new projects
// update-projects: modifies existing projects
// Always return both structured data AND human-readable text with next steps
return {
textContent: `Action completed: ${result}\n${formatNextSteps(suggestions)}`,
structuredContent: { data, metadata },
};| Choice | Rationale |
|---|---|
add-projects + update-projects vs combined tool |
Explicit intent reduces ambiguity, clearer tool selection for LLMs |
delete-object (universal) vs type-specific tools |
Deletion logic similar across types, reduces LLM cognitive load |
add-tasks (batch) vs single task |
Common to add multiple related tasks at once |
| Rich responses with next steps | Maintains workflow momentum, helps LLMs choose follow-up actions |
- Represents distinct user workflow
- Can't elegantly extend existing tools
- Has unique parameter requirements
- Closely related to existing tool's purpose
- Can be handled with additional parameters
- Follows same workflow pattern
- Action verbs:
find-,add-,manage-,complete- - User terminology:
complete-tasksnotclose-tasks - Batch support: When users commonly do multiple items
- Smart defaults: Optional parameters, auto-detect intent
- Rich responses: Structured data + human text + next steps
Exception to the Design Philosophy: The search and fetch tools follow the OpenAI MCP specification which requires specific return formats:
search: Returns JSON-encoded array of results withid,title,urlfetch: Returns JSON-encoded object withid,title,text,url,metadata
These tools return raw JSON strings instead of rich responses with next steps, as required by OpenAI's protocol. They use composite IDs (task:{id} or project:{id}) to distinguish between entity types.
- One-to-one API mapping without added value
- Overly complex parameters for basic operations
- Inconsistent interfaces across similar tools
- Raw API responses without context
- Forcing multiple tool calls for related operations