I built an MCP server that lets Claude manage my GitHub profile and DEV.to articles — here's how A developer built an MCP server in under 100 lines of Python that connects Claude to GitHub and DEV.to APIs, enabling natural language commands to manage repositories and articles. The server exposes seven tools for fetching profile stats, listing repos, and creating or updating DEV.to articles. I wanted Claude to know about my developer presence — my repos, my articles, my stats — without me having to paste links every time. So I built a small MCP server that connects both GitHub and DEV.to directly to Claude. Now I can just say: "What's my most starred repo?" or "Draft a DEV.to article about my latest project" — and Claude actually does it. Here's how I built it in under 100 lines of Python. Model Context Protocol https://github.com/modelcontextprotocol/python-sdk is an open standard that lets you connect external tools and APIs to Claude and other LLMs . You define tools with a decorator, run a server, and Claude can call those tools during a conversation. I'm a contributor to the MCP Python SDK, so naturally I wanted to build something real with it. The server exposes 7 tools across two APIs: GitHub: get github profile — followers, repos, bio list repos — sort by stars/forks/updated get repo stats — stars, forks, issues for any repo DEV.to: list articles — all your articles with reaction/view counts create article — draft or publish a new article update article — edit title, body, or publish state get article stats — reactions, comments, page viewsInstall the only dependency: pip install mcp cli Create a .env file: GITHUB TOKEN=your github token GITHUB USERNAME=your github username DEV TO API=your devto api key DEV USERNAME=your devto username Here's the full server server.py : python import os, json, urllib.request from mcp.server.fastmcp import FastMCP GITHUB USERNAME = os.environ.get "GITHUB USERNAME", "" DEV USERNAME = os.environ.get "DEV USERNAME", "" mcp = FastMCP "developer-presence" def gh path, method="GET", data=None : req = urllib.request.Request f"https://api.github.com{path}", method=method req.add header "Authorization", f"token {os.environ 'GITHUB TOKEN' }" req.add header "Accept", "application/vnd.github.v3+json" if data: req.add header "Content-Type", "application/json" req.data = json.dumps data .encode with urllib.request.urlopen req as r: return json.loads r.read def dev path, method="GET", data=None : req = urllib.request.Request f"https://dev.to/api{path}", method=method req.add header "api-key", os.environ "DEV TO API" req.add header "Content-Type", "application/json" if data: req.data = json.dumps data .encode with urllib.request.urlopen req as r: return json.loads r.read @mcp.tool def get github profile - dict: """Fetch public GitHub profile stats.""" u = gh f"/users/{GITHUB USERNAME}" return {"login": u "login" , "name": u.get "name" , "bio": u.get "bio" , "public repos": u "public repos" , "followers": u "followers" } @mcp.tool def list repos sort: str = "updated", limit: int = 10 - list: """List public repos sorted by updated/stars/forks.""" repos = gh f"/users/{GITHUB USERNAME}/repos?sort={sort}&per page={min limit,100 }" return {"name": r "name" , "stars": r "stargazers count" , "language": r.get "language" , "url": r "html url" } for r in repos @mcp.tool def list articles per page: int = 10 - list: """List your DEV.to articles with stats.""" articles = dev f"/articles/me?per page={min per page,30 }" return {"id": a "id" , "title": a "title" , "reactions": a.get "positive reactions count", 0 , "page views": a.get "page views count", 0 } for a in articles @mcp.tool def create article title: str, body markdown: str, tags: list str = None, published: bool = False - dict: """Create a new DEV.to article.""" payload = {"article": {"title": title, "body markdown": body markdown, "published": published}} if tags: payload "article" "tags" = tags result = dev "/articles", method="POST", data=payload return {"id": result "id" , "url": result.get "url" } if name == " main ": mcp.run Full version with all 7 tools on GitHub https://github.com/enjoykumawat/developer-presence-mcp Dev mode — opens MCP Inspector in browser mcp dev server.py Or wire into Claude Desktop For Claude Desktop, add this to claude desktop config.json : { "mcpServers": { "developer-presence": { "command": "python", "args": "/path/to/server.py" , "env": { "GITHUB TOKEN": "...", "GITHUB USERNAME": "...", "DEV TO API": "...", "DEV USERNAME": "..." } } } } Once connected, I can ask Claude things like: It sounds simple, but having your developer presence queryable from a conversation is surprisingly useful — especially when you're writing content and want to reference your own work. Everything is on GitHub: enjoykumawat/developer-presence-mcp https://github.com/enjoykumawat/developer-presence-mcp If you want to adapt it for your own username, just update the .env file — no other changes needed. I'm a contributor to the MCP Python SDK https://github.com/modelcontextprotocol/python-sdk . If you're interested in building MCP servers, feel free to reach out or check out the official SDK — it's a great place to start. Follow me here on DEV.to @enjoy kumawat for more AI tooling content.