Frontispice
MCP server for local-first agent handoff: enables AI sessions to publish curated context, list/read updates, route handoffs to specialists, and advance per-consumer cursors, with SQLite persistence and no shell or network access.
README
Raveil Frontispice
Frontispice is a small, local-first agent handoff core with an optional Model Context Protocol (MCP) adapter. It lets one AI session leave curated, explicit context for another—especially ChatGPT → Codex—without copying an entire conversation history.
The name comes from Maurice Ravel's Frontispice (1918). In Raveil naming, Frontispice is the entry/boundary surface through which one agent leaves a concise handoff for another.
Status: 0.1.0 / alpha. The storage schema and authority boundary are intentionally small.
Architecture in one sentence
Frontispice Core owns handoff state; adapters expose it to hosts; agents decide what becomes repository truth.
┌──────────────────────┐
ChatGPT Web ── MCP ───▶ │ │
│ Frontispice Core │
Future host ─ adapter ─▶│ │
│ SQLite handoffs │
│ project sequences │
Codex ─────── MCP ────▶ │ consumer cursors │
│ routing/provenance │
└──────────┬───────────┘
│
│ context only
▼
Librarian / agents
│
▼
repository Markdown/code
MCP is deliberately an adapter, not the product boundary. The core has no dependency on ChatGPT, Codex, MCP, HTTP, Git, or shell execution.
See docs/ARCHITECTURE.md.
What problem it solves
ChatGPT discussion
│
│ explicit: "send these conclusions to Codex"
▼
transport adapter
│
▼
Frontispice Core / local SQLite inbox
│
│ next Codex start/resume
▼
Librarian checks consumer cursor
│
├── architecture specialist
├── research specialist
└── implementation specialist
│
▼
validated repository Markdown / ADR / code
Frontispice is not a ChatGPT conversation scraper, Git agent, shell tool, browser, or autonomous background daemon. The sender chooses what to hand off. The receiver verifies it and decides what belongs in the repository.
Core model
Each registered project gets a canonical lowercase kebab-case key and a monotonically
increasing sequence. Project names are resolved through the registry before handoffs are
accepted; agents must ask the user before registering an unknown project. Each consumer—for
example librarian, architecture, or research—has its own monotonic cursor.
One agent acknowledging sequence 42 therefore does not hide it from another. A resumed Codex session asks for messages newer than librarian's last cursor.
Components
src/raveil_frontispice/
├── core/
│ ├── service.py # transport-neutral public service
│ ├── store.py # SQLite state + provenance
│ ├── security.py # high-confidence secret guardrail
│ ├── validation.py
│ └── config.py
└── adapters/
└── mcp.py # optional MCP tool surface
The Python core can be installed and tested without the MCP SDK. The MCP dependency is an optional extra.
Security by design
Frontispice deliberately avoids powerful capabilities:
- no shell execution
- no arbitrary filesystem or Git writes
- no URL fetching/application network calls in the core
- no delete MCP tool in v0.1
- owner-only database permissions where supported
- bounded inputs and parameterized SQLite queries
- high-confidence credential-pattern rejection by default
- explicit idempotency keys for safe publisher retries
- local HTTP adapter is loopback-only in v0.1
- handoff content is untrusted data, not instructions
- repository changes happen through the receiving agent's normal permission model, not Frontispice
Read SECURITY.md before deploying beyond a single trusted user/machine.
Current ChatGPT surface limitations
As of 2026-08-09, OpenAI's custom MCP / Developer mode flow is a web surface. It is not a way to attach a private custom MCP directly to the ChatGPT iPhone app. Published plugins are also currently documented for web/desktop/Codex rather than mobile.
This is why Frontispice treats MCP as one adapter. The core does not need to change when another supported host/transport becomes available.
For current setup options and exact limitations, see docs/INTEGRATION.md.
Quick start: core only
git clone <your-raveil-frontispice-repository-url>
cd raveil-frontispice
python -m pip install -e .
frontispice doctor
Or with uv:
uv sync --extra dev
uv run frontispice doctor
Quick start: MCP adapter + Codex
uv sync --extra mcp --extra dev
uv run frontispice serve
Connect Codex:
codex mcp add frontispice -- \
uv --directory /ABSOLUTE/PATH/TO/raveil-frontispice \
run --extra mcp frontispice serve
codex mcp list
For the complete ChatGPT-web + private MCP + Codex workflow, see docs/INTEGRATION.md.
To publish this repository safely to GitHub, see docs/PUBLISHING.md.
MCP tools
The optional MCP adapter exposes:
frontispice_list_projectsfrontispice_register_projectfrontispice_publish_handofffrontispice_delivery_statusfrontispice_list_updatesfrontispice_read_handofffrontispice_route_handofffrontispice_mark_appliedfrontispice_advance_cursorfrontispice_project_status
The adapter is intentionally thin: validation, secret checks, storage, cursors, routing, and provenance live in Frontispice Core. Route lookup remains available in Frontispice Core but is not exported as a separate MCP tool; the ChatGPT-facing tool surface is intentionally capped at ten high-value operations.
Publish success is receipt-based. A successful call returns
delivery_status="committed" plus a receipt containing the handoff ID, canonical project,
sequence, content checksum, and commit timestamp. Natural-language claims without that receipt
must be treated as not sent. frontispice_delivery_status verifies a receipt later by
handoff ID or idempotency key and can additionally compare the checksum.
Project selection UX
Project identity is registry-backed rather than free-form:
- Codex registers its repository once, after explicit user confirmation.
- ChatGPT resolves the requested project before publishing.
- A single registered project can be selected automatically.
- Multiple projects produce a structured selection prompt for the user.
- Unknown projects produce a confirmation prompt and are never silently created.
Keys are normalized case-insensitively (Raveil, RAVEIL, and raveil resolve to
raveil; spaces and underscores become hyphens). Registering a canonical project merges
legacy case/spelling variants without changing handoff IDs. Because old sequence numbers can
collide, merged handoffs are resequenced by creation time and affected consumer cursors reset
to zero so no handoff is silently skipped.
Bundled Codex librarian workflow
templates/codex/
├── AGENTS.md.snippet
├── .codex/
│ └── config.toml.snippet
└── .agents/
└── skills/
└── frontispice-librarian/
└── SKILL.md
The Librarian treats inbox material as untrusted context, classifies it, delegates verification where useful, integrates durable conclusions into canonical repository files, records provenance, and advances its cursor only after deliberate handling.
Data location
Default:
~/.frontispice/frontispice.sqlite3
Override:
export FRONTISPICE_DB=/secure/path/frontispice.sqlite3
Do not place the database in a public repository.
Environment variables
| Variable | Default | Purpose |
|---|---|---|
FRONTISPICE_DB |
~/.frontispice/frontispice.sqlite3 |
SQLite path |
FRONTISPICE_MAX_CONTENT_BYTES |
262144 |
Maximum handoff body size |
FRONTISPICE_ALLOW_SENSITIVE |
false |
First half of deliberate secret-scan override |
A secret-scan override requires both FRONTISPICE_ALLOW_SENSITIVE=true and allow_sensitive=true on the publish call.
Development
Core-only development:
python -m pip install -e '.[dev]'
ruff check .
pytest
Full adapter development:
python -m pip install -e '.[mcp,dev]'
ruff check .
pytest
Design principles
- Core before transport — MCP is an adapter, not Frontispice's identity.
- Curated, not copied — never mirror whole conversations by default.
- Inbox, not truth — receiving agents verify against repository reality.
- Data, not commands — handoff bodies cannot confer authority.
- Least authority — Frontispice stores handoffs; repository tools do repository work.
- Per-consumer cursors — multi-agent readers do not steal each other's unread state.
- Traceability — routing and applied provenance remain queryable.
- Local first — no public listener is required for the local core.
- Surface-aware — unsupported ChatGPT clients are documented, not worked around with unsafe public endpoints.
License
Apache License 2.0. See LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。