{
  "markdown": "<div align=\"center\">\n\n# `eyeot-mcp`\n\n### Plug Claude Desktop into your ERP.\n\n**Official stdio ↔ HTTP bridge for the [eyeot ERP](https://erp.eyeot.fr) MCP server.**\n~600 business tools, one `pip install`.\n\n<br />\n\n[![PyPI version](https://img.shields.io/pypi/v/eyeot-mcp?color=4f46e5&label=PyPI&style=for-the-badge)](https://pypi.org/project/eyeot-mcp/)\n[![Python](https://img.shields.io/pypi/pyversions/eyeot-mcp?color=4f46e5&style=for-the-badge)](https://pypi.org/project/eyeot-mcp/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-10b981?style=for-the-badge)](https://opensource.org/licenses/MIT)\n[![MCP](https://img.shields.io/badge/MCP-2024--11--05-8b5cf6?style=for-the-badge)](https://modelcontextprotocol.io)\n\n[![Dependencies](https://img.shields.io/badge/Runtime_Deps-0-10b981?style=flat-square)](#)\n[![LOC](https://img.shields.io/badge/Source-~290_LOC-64748b?style=flat-square)](#)\n[![Auditable](https://img.shields.io/badge/Auditable_in-10_min-64748b?style=flat-square)](#)\n[![Auth](https://img.shields.io/badge/Auth-OAuth_2.1_%2B_PKCE-f59e0b?style=flat-square)](#-authentication)\n\n[**Landing page**](https://erp.eyeot.fr/mcp) · [**Docs**](https://erp.eyeot.fr/api/docs) · [**PyPI**](https://pypi.org/project/eyeot-mcp/) · [**Issues**](https://github.com/Termi24/ERP-by-Eyeot-Software/issues)\n\n</div>\n\n<br />\n\n---\n\n## ⚡ 60-second install\n\n```bash\npip install eyeot-mcp        # 1.  install the bridge\neyeot-mcp login              # 2.  authenticate via browser (OAuth Device Flow)\n```\n\nThen paste into your Claude Desktop config:\n\n```json\n{\n  \"mcpServers\": {\n    \"eyeot\": {\n      \"command\": \"eyeot-mcp\"\n    }\n  }\n}\n```\n\nRestart Claude Desktop. Done. Ask: *\"List my last 5 invoices.\"*\n\n> **Config location**  ·  macOS `~/Library/Application Support/Claude/claude_desktop_config.json` · Windows `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n<br />\n\n## 🧩 What is this?\n\nThe **eyeot ERP** exposes ~600 business actions — CRM, sales, stock, maintenance, HR, finance, IT service management, GED, RGPD compliance, plus 6 V2 marketplace modules (POS, delivery & routing, recruitment, BPM, field service, supply chain) — as **MCP tools over HTTPS**.\n\nBut Claude Desktop, Cursor, and most local agents only speak **MCP over stdio**.\n\n`eyeot-mcp` is the missing piece between them.\n\n```mermaid\nflowchart LR\n    A[\"🤖 Claude Desktop<br/>Cursor / custom agent\"] -- \"JSON-RPC<br/>over stdio\" --> B[\"📦 eyeot-mcp<br/>(this package)\"]\n    B -- \"HTTPS POST<br/>Bearer token\" --> C[\"🏢 eyeot ERP<br/>(your tenant)\"]\n    C -. \"Auth · RBAC · audit<br/>multi-tenant isolation<br/>license guard\" .-> C\n\n    style A fill:#eef2ff,stroke:#6366f1,color:#1e293b\n    style B fill:#f0fdf4,stroke:#10b981,color:#065f46\n    style C fill:#fef3c7,stroke:#f59e0b,color:#78350f\n```\n\n**Zero business logic in the bridge.** Everything happens server-side — auth, RBAC, audit logging, license enforcement, multi-tenant isolation, idempotency. The CLI is ~290 lines of Python standard library. You can audit it in 10 minutes.\n\n<br />\n\n## 🎯 What can your agent do?\n\nAfter install, your MCP client gets access to actions like:\n\n| Domain | Try saying… |\n|---|---|\n| 💼 **CRM** | *\"Create a quote for ACME — 10 units of PROD-001 at standard tariff.\"* |\n| 📊 **Sales** | *\"List my last 5 invoices and their payment status.\"* |\n| 📦 **Stock** | *\"Which products in Lyon site are below the critical threshold?\"* |\n| 🔧 **Maintenance** | *\"Which equipment is overdue for preventive maintenance this week?\"* |\n| 👥 **HR** | *\"Show me pending leave requests for my team.\"* |\n| 💰 **Finance** | *\"What's the revenue forecast for Q3 by business unit?\"* |\n| 🎫 **IT support** | *\"Open a ticket: VPN is down for the marketing team, P1.\"* |\n| 📄 **GED** | *\"Find all signed NDAs for partner XYZ.\"* |\n| 🧠 **Intelligence** | *\"Customer-health distribution across all active accounts.\"* |\n| 🧾 **POS / Caisse** | *\"Today's Z-report total for the Lyon register.\"* |\n| 🚚 **Delivery** | *\"Optimize today's route for vehicle TL-204 and notify recipients.\"* |\n| 🧑‍💼 **Recruitment** | *\"Shortlist candidates for the senior developer posting.\"* |\n| ⚙️ **Process / BPM** | *\"Which approval tasks are pending in my inbox?\"* |\n| 🏗️ **Field service** | *\"Schedule a site intervention for client XYZ next Tuesday.\"* |\n| 🔩 **Supply chain** | *\"Run MRP and list the components to reorder this week.\"* |\n\n…and ~590 more, auto-generated from the [OpenAPI spec](https://erp.eyeot.fr/api/v1/openapi.json).\n\n<br />\n\n## 🔐 Authentication\n\nTwo modes, **same Bearer header** on the wire, **same Authorization decorator** server-side.\n\n<table>\n<tr>\n<th width=\"50%\">\n\n### 🤖 OAuth 2.1 (humans)\n\n</th>\n<th width=\"50%\">\n\n### 🔑 API key (services)\n\n</th>\n</tr>\n<tr>\n<td valign=\"top\">\n\nFor Claude Desktop, Cursor, personal agents.\n\n```bash\neyeot-mcp login\n```\n\nOpens browser → approve → done. Credentials saved to `~/.eyeot-mcp/config.json` (mode `0600`).\n\n- Token format: `eya_<base64>` access + `eyr_<base64>` refresh\n- Lifetime: **1 h** access / **30 d** refresh\n- **PKCE S256** mandatory (public clients)\n- Refresh rotation with replay detection — a stolen refresh kills the whole token family\n- The CLI **auto-refreshes** the access token (proactively before expiry + on a 401) — stay connected for the full 30-day refresh window without re-running `login`\n\n</td>\n<td valign=\"top\">\n\nFor CI/CD agents, batch jobs, server-to-server.\n\n```json\n{\n  \"mcpServers\": {\n    \"eyeot\": {\n      \"command\": \"eyeot-mcp\",\n      \"env\": { \"EYEOT_TOKEN\": \"eyk_xxx_xxx\" }\n    }\n  }\n}\n```\n\nIssued by an org admin from the eyeot ERP settings panel.\n\n- Token format: `eyk_<prefix>_<secret>`\n- Lifetime: **until revoked**\n- Scope: org-wide, configurable RBAC\n\n</td>\n</tr>\n</table>\n\n<br />\n\n## 🛡️ Security model\n\n<table>\n<tr>\n<td width=\"25%\" valign=\"top\" align=\"center\">\n\n### 🔒\n**OAuth 2.1 + PKCE**\n\nPublic clients use PKCE S256. Refresh rotation with replay detection.\n\n</td>\n<td width=\"25%\" valign=\"top\" align=\"center\">\n\n### 👮\n**Server-side RBAC**\n\nEvery tool call goes through the same `@permissions_required` decorators as the UI.\n\n</td>\n<td width=\"25%\" valign=\"top\" align=\"center\">\n\n### 📝\n**Full audit trail**\n\nEvery action logged with user + tenant + IP. RGPD-compliant retention.\n\n</td>\n<td width=\"25%\" valign=\"top\" align=\"center\">\n\n### 💳\n**License grace**\n\nSubscription lapsed? GETs still work so the agent can inform you. POSTs return 402 with `activate_url`.\n\n</td>\n</tr>\n</table>\n\n> **Local credentials** stored at `~/.eyeot-mcp/config.json` with file mode `0600` (POSIX). On Windows, file ACLs apply. **No telemetry, no phone-home.**\n\n<br />\n\n## 🏗️ Self-hosting\n\nPoint the bridge at any eyeot deployment with `--base-url`:\n\n```bash\neyeot-mcp --base-url https://erp.example.com login\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"eyeot\": {\n      \"command\": \"eyeot-mcp\",\n      \"args\": [\"--base-url\", \"https://erp.example.com\"]\n    }\n  }\n}\n```\n\nSame protocol, same auth, your infra.\n\n<br />\n\n## 📚 Commands\n\n| Command | Description |\n|---|---|\n| `eyeot-mcp` | Start the stdio bridge using saved credentials (default mode — what Claude Desktop runs) |\n| `eyeot-mcp login` | Browser-based OAuth Device Authorization Grant |\n| `eyeot-mcp logout` | Revoke refresh token server-side, delete local credentials |\n| `eyeot-mcp --token eyk_...` | One-shot mode with an explicit API key |\n| `eyeot-mcp --base-url URL ...` | Target a self-hosted deployment |\n\n<br />\n\n## 🔧 How it works (under the hood)\n\n1. Claude Desktop spawns `eyeot-mcp` as a child process, exchanges JSON-RPC 2.0 over its stdin/stdout pipes.\n2. For each line received on stdin, the bridge `POST`s the JSON to `${base_url}/api/v1/mcp` with `Authorization: Bearer <token>`.\n3. The HTTP response is written verbatim to stdout, framed as line-delimited JSON.\n4. The server speaks MCP `2024-11-05` and auto-generates ~600 tools from the OpenAPI spec — `initialize`, `tools/list`, `tools/call` all work exactly as MCP clients expect.\n\nNo state in the bridge. No protocol translation beyond transport. No surprises.\n\n<br />\n\n## 📖 Resources\n\n<table>\n<tr>\n<td valign=\"top\">\n\n#### Landing & install\n- 🌐 [erp.eyeot.fr/mcp](https://erp.eyeot.fr/mcp)\n- 📦 [PyPI](https://pypi.org/project/eyeot-mcp/)\n- 🐙 [GitHub](https://github.com/Termi24/ERP-by-Eyeot-Software)\n\n</td>\n<td valign=\"top\">\n\n#### API\n- 📘 [Swagger UI](https://erp.eyeot.fr/api/docs)\n- 📄 [OpenAPI spec](https://erp.eyeot.fr/api/v1/openapi.json)\n- 🧩 [MCP manifest](https://erp.eyeot.fr/api/v1/mcp/manifest)\n\n</td>\n<td valign=\"top\">\n\n#### Spec & protocol\n- 🔗 [modelcontextprotocol.io](https://modelcontextprotocol.io)\n- 🔐 [OAuth 2.1 (draft)](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1)\n- 📜 [RFC 8628 — Device Grant](https://datatracker.ietf.org/doc/html/rfc8628)\n\n</td>\n</tr>\n</table>\n\n<br />\n\n## 🧭 Versioning\n\n- This package: [Semantic Versioning](https://semver.org). Major bumps may change CLI flags or the on-disk config schema.\n- MCP protocol: `2024-11-05` (negotiated server-side).\n- ERP API: `/api/v1` (stable). Breaking changes ship as `/api/v2`.\n\n<br />\n\n## 📄 License\n\n[**MIT**](LICENSE) — fork it, package it, audit it, build on top of it.\n\nThe eyeot ERP backend is a separate, proprietary product of **Eyeot Software**. This bridge is open-source so anyone can audit it, fork it, package it for their distro, or use it as a reference for building their own MCP clients.\n\n<br />\n\n---\n\n<div align=\"center\">\n\n### ERP by Eyeot Software\n\nMulti-tenant, AI-native ERP for SMBs. Built to be operated by AI agents from day one.\n\nEvery action you can do in the UI, you can do via this bridge.\n\n🌐 [**erp.eyeot.fr**](https://erp.eyeot.fr)  ·  ✉️ [contact@eyeot.fr](mailto:contact@eyeot.fr)\n\n</div>\n",
  "bytes": 9663,
  "sha": "517ca78e15a4090706cf540585c05cc1d5426eff8378162033f8cf60bb9b75f4",
  "repo_slug": "termi24/erp-by-eyeot-software",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_termi24_eyeot_erp_5bc7898c/readme"
}