ワンクリックで
mcp-buildervalidate
Validate your MCP server against best practices and catch common anti-patterns
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Validate your MCP server against best practices and catch common anti-patterns
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Scaffold a new MCP server with your chosen pattern (basic, tool-heavy, widget-enabled, or database-backed)
Test your MCP server with MCP Inspector and verify tool functionality
Scaffold a complete MCP App with visual UI tools (TypeScript + React + Tailwind)
Add OAuth authentication to your MCP server using Auth0 or custom providers
Add a resource to your MCP server for agent context (schemas, templates, reference data)
Add a new tool to your MCP server using "true task" design principles
| name | mcp-builder:validate |
| description | Validate your MCP server against best practices and catch common anti-patterns |
You are helping the user validate their MCP server against best practices.
Find the MCP server implementation:
server.py or files with @mcp.tool() decoratorsindex.ts with ListToolsRequestSchema handlersRule: Tool names should be kebab-case and describe the action.
PASS: get-stock-summary, search-tasks, create-user
FAIL: getStockSummary, get_stock, task, doThing
Rule: Descriptions should tell the agent WHEN to use the tool.
PASS: "Search for tasks by keyword. Returns full task details including
content, assignee, and due date. Use when the user wants to find
specific tasks or see what's assigned to them."
FAIL: "Searches tasks"
FAIL: "This tool searches for tasks in the database"
Validation criteria:
Rule: Tools should not require sequential calling.
FAIL: Tool A returns IDs, Tool B requires those IDs
- find_users(query) -> [id1, id2]
- get_user(id) -> {details}
PASS: Single tool returns complete result
- search_users(query, include_details=true) -> [{full_user}]
Detection:
Rule: All parameters should have descriptions.
# FAIL - No descriptions
class Input(BaseModel):
query: str
limit: int
# PASS - Clear descriptions
class Input(BaseModel):
query: str = Field(..., description="Search term for task subject or content")
limit: int = Field(10, description="Maximum results to return (1-100)")
Rule: Errors should be actionable for agents.
FAIL: "Error occurred"
FAIL: "Invalid input"
FAIL: "500 Internal Server Error"
PASS: "Task not found with ID: abc123. Please verify the task exists."
PASS: "Invalid date format. Expected ISO 8601 (e.g., 2025-01-15T10:30:00Z)"
PASS: "Rate limit exceeded. Try again in 60 seconds."
Rule: If tools need context, resources should provide it.
WARNING: Tool 'query_database' exists but no schema resource found.
Consider adding a schema://database resource so agents
understand the data structure.
Rules:
Output a validation report:
# MCP Server Validation Report
## Summary
- Tools: 5
- Resources: 2
- Issues Found: 3
## Tool Analysis
### get-stock-summary
Status: PASS
- Name: kebab-case
- Description: Explains when to use
- Schema: All fields documented
### search-tasks
Status: WARNING
- Name: kebab-case
- Description: Could be more specific about return format
- Schema: Missing description for 'status' parameter
### get-task-details
Status: FAIL
- Sequential Call Pattern: This tool takes an ID that comes from
'search-tasks'. Consider merging into search-tasks with
include_details parameter.
## Recommendations
1. Merge get-task-details into search-tasks
2. Add description to 'status' parameter in search-tasks
3. Consider adding schema://database resource for context
## Security Notes
- No hardcoded secrets found
- Database queries use parameterized statements
- Consider adding authentication for write operations
For each issue, provide specific fix suggestions:
# ISSUE: Sequential call pattern
# BEFORE:
@mcp.tool()
def search_tasks(query: str) -> List[str]:
"""Search for task IDs matching query."""
return [t.id for t in db.search(query)]
@mcp.tool()
def get_task(id: str) -> dict:
"""Get task details by ID."""
return db.get_task(id)
# AFTER:
@mcp.tool()
def search_tasks(
query: str,
include_details: bool = True
) -> List[dict]:
"""Search for tasks matching query. Returns full task details
including content, status, and assignee."""
tasks = db.search(query)
if include_details:
return [task.to_dict() for task in tasks]
return [{"id": t.id, "subject": t.subject} for t in tasks]
Python:
# Check syntax
python -m py_compile server.py
# Type check (if using mypy)
mypy server.py
# Run server and check tool listing
python server.py &
curl http://localhost:8000/mcp -d '{"method":"tools/list"}'
TypeScript:
# Type check
tsc --noEmit
# Run and test
npm run dev &
curl http://localhost:3000/mcp -d '{"method":"tools/list"}'