Claude-skill-registry-data mcp-tools

Create MCP server tools with Official Python MCP SDK for AI agents. Use when building MCP tools, registering tool schemas, or creating AI-accessible functions.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry-data
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/mcp-tools-jawad-chaudhary-hackathone-2-todo-sp" ~/.claude/skills/majiayu000-claude-skill-registry-data-mcp-tools-885612 && rm -rf "$T"
manifest: data/mcp-tools-jawad-chaudhary-hackathone-2-todo-sp/SKILL.md
source content

MCP Tools Development (Official SDK)

Tool Registration

from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio

server = Server("mcp-server")

@server.list_tools()
async def list_tools() -> list[Tool]:
    return [
        Tool(
            name="tool_name",
            description="What this tool does",
            inputSchema={
                "type": "object",
                "properties": {
                    "user_id": {"type": "string"},
                    "param": {"type": "string", "maxLength": 200}
                },
                "required": ["user_id", "param"]
            }
        )
    ]

@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
    if name == "tool_name":
        # Validate inputs
        if not arguments.get("user_id"):
            return [TextContent(type="text", text='{"error": "user_id required"}')]
        
        # Stateless: create DB session per call
        async with get_db_session() as session:
            # Do work
            result = {"status": "success", "data": {}}
            return [TextContent(type="text", text=json.dumps(result))]

Server Startup

async def main():
    async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
        await server.run(read_stream, write_stream, server.create_initialization_options())

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

Key Rules

  • Stateless tools (no global state)
  • DB session per tool call
  • Return exact JSON schemas
  • Input validation before operations
  • User isolation (filter by user_id)