# Furkan Köykıran Blog (English) > Furkan Köykıran's engineering blog: MCP servers and AI agents, open-source contributions, Python trading bots, Python backend and DevOps, written from hands-on work. Engineering blog by Furkan Köykıran. Main topics: MCP (Model Context Protocol) servers and AI agents, contributions to large open-source projects, Python trading bots (Freqtrade, Telegram), Python backend and DevOps (FastAPI, Docker, Nginx, GitHub Actions). Posts are written in Turkish first; English versions live under https://blog.furkankoykiran.com.tr/en/, and the Turkish archive is listed at https://blog.furkankoykiran.com.tr/llms.txt. Author: Furkan Köykıran, software developer. Projects, open-source contributions and contact: https://furkankoykiran.com.tr/en/ Every post is also available as Markdown by appending `index.md` to its URL (e.g. https://blog.furkankoykiran.com.tr/en/posts/github-actions-self-hosted-runner/index.md). Full text of all English posts: https://blog.furkankoykiran.com.tr/en/llms-full.txt ## Series - [Open Source Contributions](https://blog.furkankoykiran.com.tr/en/series/open-source-contributions/): 7 posts - [My MCP Servers](https://blog.furkankoykiran.com.tr/en/series/my-mcp-servers/): 4 posts - [Algorithmic Trading with Python](https://blog.furkankoykiran.com.tr/en/series/algorithmic-trading-with-python/): 3 posts - [GitHub Actions](https://blog.furkankoykiran.com.tr/en/series/github-actions/): 2 posts ## All posts - [GitHub Actions Self-Hosted Runner on Linux: Setup Guide](https://blog.furkankoykiran.com.tr/en/posts/github-actions-self-hosted-runner/index.md): My free GitHub Actions minutes (2,000 a month) ran out, so I made a Linux server a self-hosted runner: dedicated user, SHA256 check, systemd, labels, security. (2026-05-06) - [freqtrade-mcp: An MCP Server for Your Freqtrade Bot](https://blog.furkankoykiran.com.tr/en/posts/freqtrade-mcp-server/index.md): My TypeScript MCP server that exposes the Freqtrade REST API to Claude and other MCP clients: 19 tools, setup, code layout and live-trading caveats. (2026-04-04) - [awesome-trending-repos: Tracking GitHub Trending Daily](https://blog.furkankoykiran.com.tr/en/posts/awesome-trending-repos-web/index.md): How my open source tracker scrapes GitHub Trending every day, compares it with past snapshots and publishes a React dashboard to GitHub Pages with Actions. (2026-03-27) - [CLI-Anything Browser Harness: My First MCP Backend PR](https://blog.furkankoykiran.com.tr/en/posts/cli-anything-browser-automation-contribution/index.md): How PR #118 added browser automation to CLI-Anything through the DOMShell MCP server: architecture, review, bugs found after merge, and a security fix. (2026-03-22) - [Keploy Contribution: Go defer and HTTP Body Leaks](https://blog.furkankoykiran.com.tr/en/posts/my-open-source-contribution-keploy/index.md): Two merged PRs to Keploy: a function that read from a closed file and HTTP response bodies that were never closed. What they taught me about defer in Go. (2026-03-20) - [SDK and CLI PRs: Jules, NotebookLM, Mission Control](https://blog.furkankoykiran.com.tr/en/posts/python-sdk-and-cli-contributions/index.md): Four PRs to Jules SDK, notebooklm-py, cli-agent and Mission Control: two merged, two closed. The code, the design choices, and why each one ended as it did. (2026-03-11) - [Security and API Fixes in Open Source: 3 Pull Requests](https://blog.furkankoykiran.com.tr/en/posts/security-and-api-fixes/index.md): A Cypher injection in LightRAG, a wrong enum value in the OpenAI Python SDK and hardcoded decimals in Coinbase AgentKit: three PRs, how each ended, and why. (2026-03-11) - [MCP Open Source Contributions: Playwright, GitHub, LobeHub](https://blog.furkankoykiran.com.tr/en/posts/mcp-ai-open-source-contributions/index.md): My PRs to Playwright MCP, the GitHub MCP Server and LobeHub: which were merged, which were closed, and what the reviews taught me. With code and links. (2026-03-11) - [AI Face Detector: Spotting AI-Made Faces with MobileNetV2](https://blog.furkankoykiran.com.tr/en/posts/ai-face-detector/index.md): AI Face Detector classifies a face photo as real or StyleGAN-generated: MobileNetV2 transfer learning, a FastAPI service, and an honest look at its limits. (2026-03-07) - [Letting an AI Agent Publish My Gemini Challenge Entry](https://blog.furkankoykiran.com.tr/en/posts/mcp-gemini-challenge-experience/index.md): For the Built with Google Gemini challenge, an AI agent wrote my entry and published it to DEV through DevTo-MCP. What worked, and the errors that slipped in. (2026-02-27) - [Telegram Wallet P2P SDKs for Python, Node.js and MCP](https://blog.furkankoykiran.com.tr/en/posts/telegram-wallet-p2p-mcp-sdk/index.md): Unofficial Python and Node.js SDKs plus an MCP server for Telegram Wallet's read-only P2P market API, with notes on decimals, pagination and rate limits. (2026-02-24) - [DevTo-MCP: Building an MCP Server for the DEV Community API](https://blog.furkankoykiran.com.tr/en/posts/devto-mcp-server/index.md): DevTo-MCP connects the DEV Community (Forem) API to assistants like Claude: Zod input checks, a retrying API client, a draft fallback and an npm naming lesson. (2026-02-18) - [OmniWire-MCP: A Fault-Tolerant News Server for AI Agents](https://blog.furkankoykiran.com.tr/en/posts/omniwire-mcp-news-server/index.md): OmniWire-MCP serves RSS, Atom, JSON and HTML sources to AI assistants, with a circuit breaker per source, content sniffing, Zod schemas and a bumpy npm release. (2026-02-06) - [Memoryze: A Spaced Repetition App with React and Supabase](https://blog.furkankoykiran.com.tr/en/posts/memoryze-spaced-repetition-flashcards/index.md): How I built Memoryze in one night: the SM-2 algorithm, Supabase auth and row level security, a 3D card flip in Framer Motion, and two bugs I still need to fix. (2026-02-05) - [Adding Lookaround to Google RE2: A Proof of Concept](https://blog.furkankoykiran.com.tr/en/posts/re2-lookaround-proof-of-concept/index.md): My fork that adds bounded lookaround to Google RE2 without backtracking, the #585 issue I opened, and what EPFL's unbounded lookbehind work showed me. (2026-02-04) - [Contributing to github-mcp-server: Two PRs, Zero Merges](https://blog.furkankoykiran.com.tr/en/posts/github-mcp-server-contribution/index.md): My two pull requests to GitHub's official MCP server: a create_discussion tool that is still open, and a read-only fix closed in favor of the maintainer's. (2026-02-04) - [GitLab and Back to GitHub: Migrating My Jekyll Blog](https://blog.furkankoykiran.com.tr/en/posts/gitlab-github-jekyll-migration/index.md): When my GitHub account was suspended I moved my repos and Jekyll blog to GitLab, then came back. How GitLab CI and GitHub Actions differed, and what I kept. (2026-02-02) - [Apache Kafka Event Streaming with KRaft and Python](https://blog.furkankoykiran.com.tr/en/posts/apache-kafka-event-streaming/index.md): Event streaming on Kafka 4 without ZooKeeper (KRaft): partition sizing, a no-loss producer, offset commits and rebalance tuning, with confluent-kafka in Python. (2025-12-04) - [Git Branching Strategies: GitFlow vs Trunk-Based](https://blog.furkankoykiran.com.tr/en/posts/git-workflow-branching-strategies/index.md): Git branching strategies compared: GitFlow, trunk-based development, merge queues, squash merges, Conventional Commits, pre-commit hooks and git bisect. (2025-11-29) - [Python Context Managers: Resource Management with with](https://blog.furkankoykiran.com.tr/en/posts/python-context-managers/index.md): A practical guide to Python context managers: __enter__ and __exit__, contextlib.contextmanager, ExitStack, async with, FastAPI lifespan, locks and common bugs. (2025-11-22) - [Modern Web UI Without a Framework: CSS and JavaScript](https://blog.furkankoykiran.com.tr/en/posts/modern-web-ui-css-javascript/index.md): A modern web UI without a framework: container queries, :has() and CSS nesting, popover and dialog, Web Components, islands, and measuring Core Web Vitals. (2025-11-15) - [Python Email Automation: smtplib, aiosmtplib and SPF](https://blog.furkankoykiran.com.tr/en/posts/python-email-automation/index.md): Python email automation done right: EmailMessage, smtplib with app passwords, aiosmtplib for batches, Jinja2 templates, and SPF, DKIM and DMARC for delivery. (2025-11-08) - [Database Connection Pooling: SQLAlchemy and PgBouncer](https://blog.furkankoykiran.com.tr/en/posts/database-connection-pool-optimization/index.md): Database connection pooling for PostgreSQL: SQLAlchemy 2 async pool settings, sizing limits per process, leaks, timeouts and PgBouncer transaction mode. (2025-11-01) - [gRPC High-Performance APIs with Python asyncio](https://blog.furkankoykiran.com.tr/en/posts/grpc-high-performance-apis/index.md): Service-to-service APIs with gRPC and Protobuf: grpcio asyncio server and client, streaming, deadlines, interceptors, schema evolution, HTTP/2 load balancing. (2025-10-22) - [Advanced pytest: Fixtures, Mocking and Hypothesis](https://blog.furkankoykiran.com.tr/en/posts/pytest-advanced-testing-techniques/index.md): Advanced testing with pytest 8: fixture scopes, parametrize, mocking with mocker and respx, async tests, Hypothesis property tests, snapshots and CI settings. (2025-10-10) - [MinIO Object Storage After the Community Edition Ended](https://blog.furkankoykiran.com.tr/en/posts/minio-object-storage/index.md): Object storage with MinIO: stateless apps, boto3 and presigned URLs, erasure coding, object lock, and what to run now that the community edition is archived. (2025-09-28) - [Real-Time WebSockets with FastAPI and Redis](https://blog.furkankoykiran.com.tr/en/posts/websocket-real-time-communication/index.md): Build a FastAPI WebSocket server, scale it across instances with Redis Pub/Sub, and handle pings, auth, Nginx proxying and client reconnects with backoff. (2025-09-15) - [Prometheus and Grafana Monitoring: Production Notes](https://blog.furkankoykiran.com.tr/en/posts/prometheus-grafana-monitoring/index.md): Prometheus and Grafana monitoring in practice: avoiding cardinality blowups, PromQL for the golden signals, recording rules, Alertmanager routing, Thanos. (2025-09-01) - [RabbitMQ Message Queues with aio-pika: Reliable Setup](https://blog.furkankoykiran.com.tr/en/posts/rabbitmq-message-queue/index.md): How to stop losing messages in RabbitMQ: prefetch, publisher confirms, quorum queues and dead letter exchanges, with working Python aio-pika examples. (2025-08-18) - [Elasticsearch Full-Text Search in Production](https://blog.furkankoykiran.com.tr/en/posts/elasticsearch-full-text-search/index.md): Full-text search with Elasticsearch 8/9 and the Python client: strict mappings, language analyzers, zero-downtime reindexing with aliases, shards, pagination. (2025-08-05) - [Nginx Load Balancing, Caching and Hardening Guide](https://blog.furkankoykiran.com.tr/en/posts/nginx-load-balancing-caching/index.md): Nginx as reverse proxy and load balancer: micro-caching, rate limiting, HTTP/2 and HTTP/3, security headers and JSON logs. A practical guide for nginx 1.30. (2025-07-20) - [Kubernetes Container Orchestration: A Production Guide](https://blog.furkankoykiran.com.tr/en/posts/kubernetes-container-orchestration/index.md): What to get right before running Kubernetes in production: resources and QoS, probes, CrashLoopBackOff debugging, Gateway API, Secrets, HPA and pod security. (2025-07-08) - [Python Image Processing: Pillow or OpenCV?](https://blog.furkankoykiran.com.tr/en/posts/python-image-processing-pillow-opencv/index.md): Image processing in Python with Pillow 11+ and OpenCV 4.x: safe uploads, EXIF rotation, WebP, headless OpenCV in Docker and a background processing pipeline. (2025-06-28) - [API Authentication Strategies: JWT, OAuth 2.1, Passkeys](https://blog.furkankoykiran.com.tr/en/posts/api-authentication-strategies/index.md): API authentication strategies by caller: storing API keys safely, JWT pitfalls, OAuth 2.1 with PKCE, passkeys, mTLS between services, and FastAPI dependencies. (2025-06-18) - [Python PDF Processing: pypdf, pdfplumber and WeasyPrint](https://blog.furkankoykiran.com.tr/en/posts/python-pdf-processing/index.md): Read, split, merge, encrypt and generate PDFs in Python: pypdf, pdfplumber for tables, WeasyPrint for HTML to PDF, OCRmyPDF for scans and pyHanko for signing. (2025-03-29) - [GitHub Actions CI/CD Pipeline for a Python Project](https://blog.furkankoykiran.com.tr/en/posts/github-actions-ci-cd-pipeline/index.md): A GitHub Actions CI/CD pipeline for Python: tests with uv, Docker images on GHCR, approval-gated deploys, reusable workflows, OIDC and security hardening. (2025-03-22) - [Python asyncio in Practice: TaskGroup, Timeouts, Semaphores](https://blog.furkankoykiran.com.tr/en/posts/python-asyncio-concurrent-processing/index.md): A practical Python asyncio guide: TaskGroup, asyncio.timeout, Semaphore, to_thread, except* and what Python 3.12 to 3.14 changed, with runnable examples. (2025-03-15) - [Python Performance Profiling: cProfile, py-spy, Scalene](https://blog.furkankoykiran.com.tr/en/posts/python-performance-profiling-optimization/index.md): A practical guide to Python performance profiling: cProfile for functions, py-spy for live processes, Scalene for line-level CPU and memory, plus memray. (2025-03-01) - [Python Logging Best Practices with structlog](https://blog.furkankoykiran.com.tr/en/posts/python-logging-best-practices/index.md): Python logging best practices: stdlib logging rules, JSON logs with structlog, request IDs, redacting secrets, OpenTelemetry trace IDs, common mistakes. (2025-02-22) - [Graceful Shutdown in Python: Signals, Docker, K8s, systemd](https://blog.furkankoykiran.com.tr/en/posts/graceful-shutdown-signal-handling/index.md): Graceful shutdown for Python services: catching SIGTERM in plain Python and asyncio, the Docker PID 1 trap, Kubernetes preStop and systemd services. (2025-02-15) - [Celery vs Arq: Async Task Queues in Python](https://blog.furkankoykiran.com.tr/en/posts/celery-arq-async-task-queue/index.md): Celery vs Arq for Python task queues: safe Celery settings, an async Arq worker, idempotency, visibility timeouts, retries and Arq's maintenance mode. (2025-02-08) - [Uptime Kuma Service Monitoring: Setup and Practical Tips](https://blog.furkankoykiran.com.tr/en/posts/uptime-kuma-service-monitoring/index.md): Self-hosted monitoring with Uptime Kuma 2: Docker setup, reverse proxy, keyword and push monitors, Telegram and webhook alerts, hardening and backups. (2025-02-01) - [Building a Reliable Webhook Handler in Python](https://blog.furkankoykiran.com.tr/en/posts/webhook-handler-event-driven-architecture/index.md): A reliable webhook handler in Python and FastAPI: HMAC signature checks, replay protection, a durable inbox table, idempotent processing and event fan-out. (2025-01-25) - [API Rate Limiting in Python with Redis, Lua and FastAPI](https://blog.furkankoykiran.com.tr/en/posts/python-rate-limiting-api-throttling/index.md): API rate limiting in Python: token bucket vs sliding window, an atomic Redis Lua limiter, a FastAPI dependency, 429 with Retry-After, and client-side backoff. (2025-01-18) - [MongoDB Schema Design with Python and Async PyMongo](https://blog.furkankoykiran.com.tr/en/posts/mongodb-nosql-data-management/index.md): MongoDB schema design in practice: embed or reference, schema validation, ESR index ordering, aggregation and transactions, with Python's async PyMongo API. (2025-01-05) - [Poetry vs uv: Comparing Python Project Management Tools](https://blog.furkankoykiran.com.tr/en/posts/poetry-python-project-management/index.md): Poetry and uv for Python project management: lock files, dependency groups, Docker and CI setups, publishing. An honest comparison of when to use which. (2024-12-28) - [SQLAlchemy 2.0 with MySQL: Async ORM, N+1 and Alembic](https://blog.furkankoykiran.com.tr/en/posts/mysql-sqlalchemy-database-management/index.md): SQLAlchemy 2.0 with MySQL and PostgreSQL: typed Mapped models, async sessions, eager loading against N+1 queries, Alembic migrations and connection pool tuning. (2024-12-22) - [Traefik v3 Reverse Proxy with Automatic SSL on Docker](https://blog.furkankoykiran.com.tr/en/posts/traefik-v3-reverse-proxy-ssl/index.md): A practical Traefik v3 setup for Docker: label-based routing, automatic Let's Encrypt SSL, middlewares, sticky sessions, canary releases and v2 migration traps. (2024-12-15) - [Redis Caching and Session Management in Python](https://blog.furkankoykiran.com.tr/en/posts/redis-caching-session-management/index.md): Redis caching and session management with redis-py asyncio: cache-aside with stampede protection, server-side sessions, Streams, locks and eviction policies. (2024-12-10) - [Fast Crypto Analysis in pandas 3: Vectorize, Then Polars](https://blog.furkankoykiran.com.tr/en/posts/pandas-crypto-market-analysis/index.md): Crypto OHLCV analysis in pandas 3 without loops: the real cost of iterrows and apply, rolling signals, sane dtypes, Parquet, and a measured Polars test. (2024-12-03) - [Dockerizing a Python App with uv and Multi-Stage Builds](https://blog.furkankoykiran.com.tr/en/posts/docker-python-app-containerization/index.md): How I dockerize Python apps: a multi-stage Dockerfile with uv, a non-root user, a healthcheck without curl, Docker Compose for local dev and SHA image tags. (2024-10-14) - [Automated Trading Systems in Python: Architecture and Risk](https://blog.furkankoykiran.com.tr/en/posts/building-automated-trading-systems-python/index.md): Structuring an automated trading system in Python with CCXT and asyncio: WebSocket data, order precision, testnet, position sizing and honest backtests. (2024-09-12) - [Smart Contract Testing with Hardhat 3 and Ethers v6](https://blog.furkankoykiran.com.tr/en/posts/smart-contract-testing-hardhat-ethers/index.md): Testing Solidity contracts with Hardhat 3, ethers v6 and Mocha: fixtures, time travel, custom errors, fuzzing, coverage, gas stats, mainnet forking and CI. (2024-08-19) - [Build a Telegram Trading Bot in Python (PTB v22 + CCXT)](https://blog.furkankoykiran.com.tr/en/posts/python-telegram-trading-bot/index.md): A private Telegram price-alert bot with python-telegram-bot v22 and async CCXT: JobQueue, user filters, persistence, token hygiene, and why it never trades. (2024-07-22) - [Solana Program Development with Rust and Anchor 1.x](https://blog.furkankoykiran.com.tr/en/posts/solana-program-development-rust/index.md): Solana program development with Rust and Anchor 1.x: accounts, PDAs, constraints, tests, security, and where Proof of History stands after Alpenglow. (2024-07-08) - [Web3 Wallet Integration: EIP-6963, Ethers v6 and Reown](https://blog.furkankoykiran.com.tr/en/posts/web3-wallet-integration/index.md): Web3 wallet integration today: EIP-6963 wallet discovery, ethers v6 BrowserProvider, chain switching, Reown AppKit for mobile, Sign-In with Ethereum. (2024-06-18) - [Polygon PoS Architecture and Layer 2 Scaling Explained](https://blog.furkankoykiran.com.tr/en/posts/polygon-pos-architecture-layer2/index.md): How Polygon PoS works: Bor, Heimdall v2, checkpoints, POL and ~5-second finality. How it differs from rollups, the zkEVM shutdown, and notes for developers. (2024-06-05) - [Ethereum with web3.py v7: Providers, Transactions, Events](https://blog.furkankoykiran.com.tr/en/posts/web3py-ethereum-interaction/index.md): Talking to Ethereum with web3.py v7: HTTP, async and WebSocket providers, signing EIP-1559 transactions, reading ERC-20s, chunked event logs and PoA chains. (2024-05-30) - [AI-Powered Trading: What ML Models and LLM Agents Taught Me](https://blog.furkankoykiran.com.tr/en/posts/ai-powered-trading-strategies/index.md): My AI-powered trading experiments: a walk-forward validated ML model, a simple data leakage test, and lessons from Quorum, where LLM agents vote on trades. (2024-05-16) - [Building a REST API with FastAPI, Pydantic v2 and Async](https://blog.furkankoykiran.com.tr/en/posts/python-fastapi-rest-api/index.md): A practical FastAPI REST API guide: Pydantic v2 schemas, Annotated dependencies, async SQLAlchemy, testing and a lean Docker setup, with code that runs. (2024-04-27) - [Flash Loan Arbitrage Bot: Lessons From My Python Prototype](https://blog.furkankoykiran.com.tr/en/posts/flash-loan-arbitrage-bot-python/index.md): DEX arbitrage with Aave V3 flash loans: what my Python bot did and didn't do, a Solidity contract that enforces profit on-chain, and mainnet fork tests. (2024-04-11) - [How a DEX Aggregator Works: Quotes, Routing, Contracts](https://blog.furkankoykiran.com.tr/en/posts/dex-aggregator-web3-routing/index.md): The parts of a DEX aggregator: Uniswap V2/V3 quotes with ethers v6, gas-adjusted comparison, split routing, a safe swap contract and MEV protection. (2024-03-29) - [Solidity Security and Gas Optimization: A Practical Guide](https://blog.furkankoykiran.com.tr/en/posts/solidity-security-gas-optimization/index.md): Reentrancy, access control, proxy pitfalls, oracle manipulation and gas optimization in Solidity 0.8 with OpenZeppelin 5, plus Foundry tests and a checklist. (2024-03-15) - [Blockchain Data Analysis in Python: Indexer, The Graph, Dune](https://blog.furkankoykiran.com.tr/en/posts/blockchain-data-analysis-python-tools/index.md): On-chain data with Python: event subscriptions in web3.py, a small SQLAlchemy 2 indexer, The Graph and Dune APIs, and Telegram alerts for large transfers. (2024-03-07) - [NFT Minting on Ethereum: ERC721A, Merkle Allowlist, Tests](https://blog.furkankoykiran.com.tr/en/posts/nft-minting-ethereum-guide/index.md): An allowlist NFT contract with ERC721A and OpenZeppelin 5: Merkle proofs, IPFS metadata, Foundry tests, an ethers v6 mint button and a Sepolia deploy. (2024-01-25) ## Pages - [About](https://blog.furkankoykiran.com.tr/en/about/): Who Furkan Köykıran is and what this blog covers: MCP servers, AI agents, open-source contributions, Python and DevOps. - [Privacy and Cookie Policy](https://blog.furkankoykiran.com.tr/en/privacy/): Which data blog.furkankoykiran.com.tr processes, with which tools and on which legal basis; cookies and your rights under KVKK and GDPR. ## Optional - [Türkçe llms.txt](https://blog.furkankoykiran.com.tr/llms.txt) - [RSS](https://blog.furkankoykiran.com.tr/en/feed.xml) - [Sitemap](https://blog.furkankoykiran.com.tr/sitemap.xml) - [Author / portfolio](https://furkankoykiran.com.tr/en/) - [GitHub](https://github.com/furkankoykiran)