eksiapi

mcp
Security Audit
Warn
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 6 GitHub stars
Code Warn
  • network request — Outbound network request in eksiapi/client.py
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

🍋 API client and MCP server for eksisozluk.com, powered by a reverse-engineered mobile API with RSA authentication.

README.md

eksiapi logo

eksiapi

Unofficial Python API client and MCP server for Ekşi Sözlük.
Supports anonymous public reads and authenticated account actions.

PyPI Python requirement MCP stdio server Tests License

Quick start · MCP server · Python SDK · Reverse engineering · Documentation

eksiapi provides structured access to topics, entries, profiles, comments and feeds. It includes matching synchronous and asynchronous Python clients plus a local stdio MCP server for AI applications.

Quick start

Install the library:

pip install eksiapi
# or
uv add eksiapi

Read entry number 1:

from eksiapi import EksiClient

with EksiClient.anonymous(raw_response=False) as eksi:
    topic = eksi.entry(1)
    entry = topic["Entries"][0]

print(f"{topic['Title']} · entry #{entry['Id']}")
print(f"@{entry['Author']['Nick']}: {entry['Content']}")
pena · entry #1
@ssg: gitar calmak icin kullanilan minik plastik garip nesne.

This call reads the mobile API directly. It does not parse HTML pages.

To run the repository example:

git clone https://github.com/agmmnn/eksiapi
cd eksiapi
uv sync
uv run examples/explore.py
🟢 eksiapi explore · 👻 anonymous
🔥 Bugün       1. güncel bir başlık · 1888 entry
📝 Entry #1    @ssg · pena
👤 @agmmnn     52 entry · 10 takipçi
✅ 7/7 endpoint başarılı

MCP server

Install the MCP server as an isolated command:

uv tool install "eksiapi[mcp]"

Add it to any stdio-compatible MCP client:

{
  "mcpServers": {
    "eksi": {
      "command": "eksi-mcp"
    }
  }
}

Example research requests:

  • “Bugünün gündemini üç ana tema halinde özetle.”
  • “Bu başlıktaki ilk üç sayfanın ortak iddialarını karşılaştır.”
  • “Bu yazarın son entry'lerinde en sık geçen konular neler?”

The server starts anonymously and read-only. Account actions require an explicit login, interactive mode and a human confirmation step:

eksi-auth login
eksi-mcp --mode interactive

MCP configuration, credentials and complete tool list →

Installation options

Use case Interface Command
Python application or script Sync/async SDK pip install eksiapi
Read access for an AI agent Read-only MCP uv tool install "eksiapi[mcp]"
Account actions from an AI agent Interactive MCP eksi-mcp --mode interactive
HTTP route reference OpenAPI contract openapi.yaml

Python SDK

Anonymous reads:

from eksiapi import EksiClient

with EksiClient.anonymous(raw_response=False) as eksi:
    today = eksi.today()
    popular = eksi.popular()
    profile = eksi.user("agmmnn")

Authenticated account data and writes:

from eksiapi import EksiClient

with EksiClient(raw_response=False) as eksi:
    eksi.login("username-or-email", "password")
    print(eksi.me())
    preview = eksi.favorite_entry(1, dry_run=True)
    print(preview.operation, preview.digest)

The async client provides the same public methods:

from eksiapi import AsyncEksiClient

async with AsyncEksiClient.anonymous(raw_response=False) as eksi:
    async for entry in eksi.iter_topic_entries("python", max_pages=3):
        print(entry)

Authentication, responses, pagination, writes and async usage →

Features

  • 🔎 API coverage: today/popular feeds, topic and entry search, profiles, comments, channels, user history and pagination.
  • 🐍 Python SDK: matching sync and async clients, typed views, retries for safe reads, token refresh, rate-limit metadata and test transports.
  • 🤖 MCP: structured results, canonical source URLs and a bounded topic-research prompt.
  • 🛡️ Write behavior: deterministic dry runs, no automatic write retries, secret-free audit events and human-approved MCP execution.
  • 📱 Runtime: Android-compatible authentication and TLS fingerprinting; no Frida session or interception proxy required at runtime.

Reverse engineering

eksiapi is based on static analysis of the Ekşi Sözlük Android 2.4.10 APK. Retrofit declarations, request models and authentication code were inspected with JADX, so the library does not require a Frida session or interception proxy at runtime.

Authentication requests include an Api-Secret value. The Android app builds the following plaintext and encrypts it with the embedded 2048-bit RSA public key:

{randomHex(40-80)}-{APP_UUID}-{len²}-{adjustedTime}-{dayOff}-{hourOff}-{minOff}-eksisozluk-android/144-{clientSecret}

The account login flow is:

  1. GET /v2/clientsettings/time to obtain the server timestamp.
  2. POST /v2/account/anonymoustoken to obtain an anonymous bearer.
  3. GET /v2/clientsettings/time again for a fresh timestamp.
  4. POST /token with the password or refresh-token grant.

The implementation is in eksiapi/auth.py. The APK hash, Retrofit annotation mapping and endpoint evidence are documented in the reverse-engineering notes.

Authentication modes

Mode Credentials Best for
Anonymous None Public topics, entries, profiles, comments, channels and feeds
Logged in Password login or an existing token Account reads, favorites, votes, follows, messages, drafts and settings

Anonymous clients obtain and renew their own app bearer. Logged-in sessions keep refresh metadata and expose the account nick without returning credentials to MCP tools.

Safety model

Python writes support dry_run=True and return a WritePreview before any HTTP mutation. Writes are never retried automatically. The MCP server is read-only by default; interactive writes use signed, expiring, single-use previews and the MCP client's human elicitation flow.

Ekşi content is untrusted external data. Agents should analyze it as content, never as instructions.

Documentation

Guide Contents
Python SDK guide Authentication, sync/async clients, responses, pagination and writes
MCP guide Installation, client configuration, credentials, modes and complete tool list
OpenAPI contract Full documented HTTP endpoint inventory and request shapes
APK analysis Reverse-engineering evidence and risk decisions
Changelog User-facing changes by release

Development

uv sync --all-groups --all-extras
uv run ruff check .
uv run ruff format --check .
uv run pytest --cov=eksiapi

Python 3.10–3.14 is tested in CI with branch coverage enforced at 80%.

Disclaimer

Unofficial and not affiliated with Ekşi Teknoloji. Intended for personal, educational and research use. API behavior may change with mobile app updates.

Reviews (0)

No results found