Codex Pets

Codex Pets

Public read-only registry for Codex-compatible animated companion packs. Search approved pets, fetch install instructions, generate badges and embed cards, and discover the pet request flow via Streamable HTTP MCP.

Category
访问服务器

README

Codex Pets

codex-pets MCP server

Community gallery for Codex-compatible animated pets with local accounts, manual moderation, public generation requests, YDB-backed asset storage, and public detail pages for approved and pending pets.

Public site: https://pets.ydb-qdrant.tech/.

Stack

  • Next.js 16 App Router, React 19, TypeScript strict
  • Gravity UI + SCSS/BEM
  • local-ydb / YDB native gRPC via ydb-sdk
  • App-owned email+password auth with YDB-backed users and sessions
  • Pet assets stored in YDB as binary blobs
  • Dynamic robots.txt, sitemap.xml, and llms.txt with /llm.txt alias
  • Agent-facing HTTP access through llms.txt / llm.txt, /mcp, JSON routes, and TOON mirrors for core registry data
  • Optional read-only browser WebMCP tools in supported browser runtimes
  • Yandex Metrika using the same counter as ydb-qdrant-ui (104844437), with optional server-side aggregate MCP metrics
  • JSZip + Sharp for package validation

Development

nvm use 24
npm install
cp .env.example .env.local
npm run dev

Open http://localhost:3000.

Agent access

Codex Pets exposes a public read-only MCP server so coding agents can search, inspect, install, and share approved pet packs.

Connect Codex:

codex mcp add codexPets --url https://pets.ydb-qdrant.tech/mcp

Run a local stdio MCP server that proxies the public gallery:

npx @astandrik/codex-pets mcp

Available MCP tools:

  • search_pets — discover approved pets when you need candidates or lack an exact slug
  • get_pet — fetch one public pet card when you already have an approved slug
  • get_install_instructions — get install commands without incrementing metrics
  • get_badge_code — generate README badge snippets for a known slug
  • get_embed_code — generate iframe embed snippets for a known slug
  • get_card_code — generate animated GIF snippets for a known slug, defaulting to sprite-only mode
  • get_pet_request_info — discover the public new-pet request workflow; it does not submit or inspect private requests

HTTP fallback routes are public too:

  • /api/manifest
  • /api/manifest.toon
  • /api/pets
  • /api/pets.toon
  • /api/pets/<slug>
  • /api/pets/<slug>.toon
  • /api/tags
  • /api/tags.toon
  • /api/pets/<slug>/share
  • /badge/<slug>.svg
  • /card/<slug>.gif
  • /embed/<slug>

If you deploy under a subpath such as /codex-pets, set:

NEXT_PUBLIC_BASE_PATH=/codex-pets
NEXT_PUBLIC_APP_URL=https://example.com/codex-pets

The public gallery renders without secrets. For account login, submit, moderation, and metrics you need YDB_PETS_ENDPOINT, YDB_PETS_DATABASE, and auth env. Optional server-side MCP metrics also need YANDEX_METRIKA_MP_TOKEN and YANDEX_METRIKA_MP_CLIENT_ID. Optional IndexNow notifications are enabled by INDEXNOW_KEY; the app serves /<key>.txt and pings IndexNow after an admin approves a pet.

To run without YDB on generated sample data:

CODEX_PETS_DATA_SOURCE=mock AUTH_MODE=single-user \
  AUTH_SINGLE_USER_EMAIL=local-admin@example.com \
  NEXT_PUBLIC_APP_URL=http://localhost:3000 \
  npm run dev -- --port 3000

Production notes

For a dedicated public subdomain such as https://pets.example.com, prefer:

NEXT_PUBLIC_APP_URL=https://pets.example.com
NEXT_PUBLIC_BASE_PATH=

If the app container talks to YDB by Docker hostname, for example grpc://ydb-local:2136, run the app on the same Docker network as the YDB containers:

docker run --network ydb-net ...

Telegram and similar preview crawlers are handled by lightweight preview routes:

  • /api/preview/site
  • /api/preview/pets/[slug]

The reverse proxy should rewrite preview-bot requests for / and /pets/<slug> to those endpoints before proxying to the normal App Router pages. See:

Local YDB quickstart

For local app development, a plain local-ydb root database at /local is enough; you do not need a CMS tenant or dynamic node. The app runs on the host, so the local-ydb container must publish gRPC on 127.0.0.1:2136.

If you use the local-ydb MCP, start from a clean root database with local_ydb_destroy_stack(confirm=true) and local_ydb_bootstrap_root_database(confirm=true). If the resulting container does not publish 127.0.0.1:2136, recreate only the container on the same volume with a host gRPC port:

docker rm -f ydb-local
docker run -d --name ydb-local --no-healthcheck --network ydb-net \
  --restart unless-stopped \
  -p 127.0.0.1:2136:2136 \
  -p 127.0.0.1:8765:8765 \
  -v ydb-local-data:/ydb_data \
  -e GRPC_PORT=2136 \
  -e MON_PORT=8765 \
  -e GRPC_TLS_PORT= \
  -e YDB_GRPC_ENABLE_TLS=0 \
  -e YDB_ANONYMOUS_CREDENTIALS=1 \
  -e YDB_LOCAL_SURVIVE_RESTART=1 \
  ghcr.io/ydb-platform/local-ydb:26.1.1.6

Use these local app env vars:

AUTH_MODE=single-user
AUTH_SINGLE_USER_ID=local-admin
AUTH_SINGLE_USER_EMAIL=local-admin@example.com
AUTH_SINGLE_USER_NAME="Local Admin"
SESSION_COOKIE_SECRET=dev-cookie-secret
PASSWORD_PEPPER=dev-password-pepper
INITIAL_ADMIN_EMAILS=local-admin@example.com

YDB_ANONYMOUS_CREDENTIALS=1
YDB_ENDPOINT=grpc://127.0.0.1:2136
YDB_PETS_ENDPOINT=grpc://127.0.0.1:2136
YDB_PETS_DATABASE=/local
NEXT_PUBLIC_APP_URL=http://localhost:3000

YDB_ENDPOINT is needed for local host-to-Docker runs because ydb-sdk otherwise follows discovery endpoints that may contain the Docker container hostname.

Apply schema, seed data, and start the app:

docker cp ydb/schema.yql ydb-local:/tmp/codex-pets-schema.yql
docker exec ydb-local /ydb -e grpc://localhost:2136 -d /local scripting yql -f /tmp/codex-pets-schema.yql
npm run db:migrate
npm run seed:dev:reset
npm run dev -- --port 3000

Open http://localhost:3000. The local YDB monitoring UI is http://127.0.0.1:8765.

For a remote or tenant-backed deployment, point the app at a reachable tenant endpoint, for example:

YDB_PETS_ENDPOINT=grpc://ydb-host:2137
YDB_PETS_DATABASE=/local/your-tenant
YDB_STATIC_CREDENTIALS_USER=appuser
YDB_STATIC_CREDENTIALS_PASSWORD_FILE=/run/secrets/app.password
YDB_STATIC_CREDENTIALS_AUTH_ENDPOINT=grpc://ydb-host:2136

For local development without a full account flow:

AUTH_MODE=single-user
AUTH_SINGLE_USER_ID=local-admin
SESSION_COOKIE_SECRET=dev-cookie-secret
PASSWORD_PEPPER=dev-password-pepper
INITIAL_ADMIN_EMAILS=local-admin@example.com

For the normal built-in account flow:

AUTH_MODE=app-session
SESSION_COOKIE_SECRET=change-me
PASSWORD_PEPPER=change-me-too
INITIAL_ADMIN_EMAILS=admin@example.com

Create tables manually on the existing local-ydb tenant:

ydb -e "$YDB_PETS_ENDPOINT" -d "$YDB_PETS_DATABASE" scripting yql -f ydb/schema.yql

Apply migrations to an existing database:

npm run db:migrate

Seed local development data after the schema exists:

npm run seed:dev

Use npm run seed:dev:reset to replace only the fixed dev_* seed records.

Current behavior

  • Public users can browse the gallery and open /pets/[slug].
  • Public users can submit a pet without logging in by providing files and an optional contact email.
  • Public users can request a generated pet without logging in by providing a contact email, text brief, and optional reference image.
  • Logged-in users can see only their own pets under /my-pets.
  • Logged-in users can see their own pet generation requests under /my-requests.
  • Admins are determined by INITIAL_ADMIN_EMAILS.
  • Admins can approve, reject, and delete pending pets from /admin/submissions.
  • Admins can review generation requests and link them to existing pets from /admin/requests.
  • Owners can delete their own pets from /my-pets.
  • Admins can delete any pet from the pet detail page.
  • Deleted pets disappear from owner lists, public listings, and sitemap.xml.

SEO, agents, and analytics

  • robots.txt is served from src/app/robots.ts.
  • sitemap.xml is dynamic and includes all currently approved pets.
  • llms.txt is dynamic and provides a curated AI-readable map of the gallery, manifest, and approved pet pages. /llm.txt is a direct plain-text alias for fetchers that request the singular filename.
  • /mcp is a public read-only Streamable HTTP MCP server for coding agents. Codex can connect with: codex mcp add codexPets --url https://pets.ydb-qdrant.tech/mcp.
  • Official MCP Registry name: tech.ydb-qdrant.pets/codex-pets-ydb-qdrant.
  • server.json and /.well-known/mcp/server.json expose MCP Registry metadata for the public remote server.
  • /.well-known/mcp-registry-auth exposes the public HTTP domain auth record used by mcp-publisher.
  • HTTP agent access is the primary public machine contract:
    • /mcp — Streamable HTTP MCP endpoint with read-only tools: search_pets, get_pet, get_install_instructions, get_badge_code, get_embed_code, get_card_code, and get_pet_request_info
    • /server.json and /.well-known/mcp/server.json — MCP Registry metadata pointing to the public Streamable HTTP remote
    • /.well-known/mcp-registry-auth — public MCP Registry HTTP auth record
    • /api/manifest — approved pet list with page URLs, install commands, and asset URLs
    • /api/manifest.toon — TOON mirror of the public manifest for LLM-friendly retrieval
    • /api/pets?q=<query>&kind=all|creature|object|character — approved pet list/search JSON without private contact emails
    • /api/pets.toon?q=<query>&kind=all|creature|object|character — TOON mirror of approved pet list/search without private contact emails
    • /api/pets/<slug> — public detail JSON for one approved pet without private contact emails
    • /api/pets/<slug>.toon — TOON mirror of public detail data without private contact emails
    • /api/tags — current tag counts for approved pets
    • /api/tags.toon — TOON mirror of current tag counts
    • /api/pets/<slug>/share — sanitized install, badge, and embed snippets
    • /api/pets/<slug>/install — read-only install instructions with no metric mutation
    • /badge/<slug>.svg — README badge SVG
    • /card/<slug>.gif — animated GIF share surface. Supports mode=sprite|card, state, and scale; default sharable output is sprite-only.
    • /embed/<slug> — iframe embed page. Supports mode=sprite|card, state, scale, theme, compact, and visibility toggles.
    • npx @astandrik/codex-pets install <slug> — CLI install command format
  • Browser WebMCP is a read-only progressive enhancement. It only works in browser runtimes that expose navigator.modelContext; ordinary HTTP crawlers and ChatGPT browsing sessions should use the endpoints above. Supported browser WebMCP tools:
    • search_codex_pets — search approved pets through /api/pets
    • get_codex_pet — fetch one approved pet through /api/pets/[slug]
    • get_codex_pets_manifest — fetch /api/manifest
    • get_current_codex_pet — inspect the approved pet open in the current tab
  • WebMCP intentionally does not expose submit, like, download/install counters, auth, admin, moderation, or delete actions.
  • The sitemap updates automatically after moderation changes; no cron or manual rebuild is needed for new approved pets to appear there.
  • Yandex Metrika is loaded in production only and tracks:
    • account register/login success and error
    • pet submit success and error
    • pet generation request success and error
    • moderation approve/reject/delete
  • Server-side MCP aggregate metrics are optional. They are enabled only when YANDEX_METRIKA_MP_TOKEN and YANDEX_METRIKA_MP_CLIENT_ID are configured. MCP metrics use a dedicated technical Metrika ClientID and send a synthetic /mcp pageview before the mcp_tool_call goal event. The payload includes only aggregate tool dimensions such as tool name, status, safe slug, kind, result count, and limit; it does not include raw MCP search text, IP address, user-agent, origin header, contact email, owner email, or owner identifiers.
  • IndexNow is optional. Set INDEXNOW_KEY in the runtime env to enable the public key file and approval-time notifications for the gallery, the new pet detail page, sitemap.xml, llms.txt, and /api/manifest.

Main routes

  • / — public gallery
  • /request — public pet generation request flow
  • /submit — public submit flow
  • /login, /register, /logout — local account flow
  • /my-pets — owner view
  • /my-requests — logged-in user generation request view
  • /admin/submissions — admin moderation queue
  • /admin/requests — admin pet generation request queue
  • /pets/[slug] — pet detail page
  • /agents — agent and MCP connection guide
  • /mcp — public read-only Streamable HTTP MCP endpoint
  • /server.json, /.well-known/mcp/server.json — MCP Registry metadata
  • /api/manifest — public agent/CLI manifest
  • /api/manifest.toon — TOON mirror of the public manifest
  • /api/pets — public approved pet list/search JSON
  • /api/pets.toon — TOON mirror of approved pet list/search
  • /api/pets/[slug] — public approved pet detail JSON
  • /api/pets/[slug].toon — TOON mirror of public pet detail data
  • /api/tags, /api/pets/[slug]/share, /api/pets/[slug]/install — read-only agent/share JSON
  • /api/tags.toon — TOON mirror of approved tag counts
  • /badge/[slug].svg, /card/[slug].gif, /embed/[slug] — share surfaces
  • /robots.txt, /sitemap.xml, /llms.txt, /llm.txt — SEO and AI-readable outputs

Agent-facing checks

Use CODEX_PETS_DATA_SOURCE=mock npm run dev -- --port 3000 to smoke-check agent-facing routes without local YDB. Expected public endpoints:

curl -I http://localhost:3000/
curl -I http://localhost:3000/api/pets
curl -I http://localhost:3000/api/pets.toon
curl -I http://localhost:3000/api/manifest
curl -I http://localhost:3000/api/manifest.toon
curl -I http://localhost:3000/api/tags
curl -I http://localhost:3000/api/tags.toon
curl -I http://localhost:3000/llms.txt
curl -I http://localhost:3000/llm.txt
curl -i http://localhost:3000/mcp

For a JSON-response MCP smoke test:

curl -s http://localhost:3000/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  --data '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

For WebMCP itself, use a WebMCP-capable Chrome or lab browser and check that navigator.modelContext exposes the read-only tools listed above. In normal browsers without WebMCP, the client registrar is a no-op; this is expected and does not affect the HTTP agent contract.

Private deployment notes

Concrete per-host instructions, local paths, and operational notes should live under a gitignored private/ directory. The public docs in this repo should stay generic and safe to commit.

Pet Package

Each pet is distributed as:

  • pet.json
  • spritesheet.webp or spritesheet.png
  • downloadable ZIP containing both files at the root

The v1 validator expects an 8x9 atlas at 1536x1872, where each cell is 192x208.

CLI install

Approved gallery pets can be installed into Codex from npm:

npx @astandrik/codex-pets install zero-two-2

The CLI reads /api/manifest from https://pets.ydb-qdrant.tech by default and writes to ${CODEX_HOME:-~/.codex}/pets/<slug>/. Use --force to replace an existing local pet folder, or CODEX_PETS_URL / --url to point at another deployment. If Codex is already running, restart it before selecting the new pet in Settings -> Appearance -> Pets.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选