{
  "markdown": "# Negirau\n\n[![CI](https://github.com/sincekmori/negirau/actions/workflows/ci.yml/badge.svg)](https://github.com/sincekmori/negirau/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)\n[![npm negirau](https://img.shields.io/npm/v/negirau?label=npm%20negirau)](https://www.npmjs.com/package/negirau)\n[![npm negirau-mcp](https://img.shields.io/npm/v/negirau-mcp?label=npm%20negirau-mcp)](https://www.npmjs.com/package/negirau-mcp)\n[![PyPI negirau](https://img.shields.io/pypi/v/negirau?label=PyPI%20negirau)](https://pypi.org/project/negirau/)\n[![Negirau](https://negirau.com/subjects/sincekmori/badge)](https://negirau.com/subjects/sincekmori)\n\n日頃の担い手に、ねぎらいを。\nNegirau (negirau.com) lets anyone send a one-tap, login-free appreciation to the people behind everyday work — fire stations, event crews, online services, open-source maintainers.\n\n- No accounts, no user-generated text, no visitor data stored.\n- Counts are shown exactly up to 100 and as \"100+\" beyond — by design, this service cannot become a ranking.\n- Runs entirely on Cloudflare Workers + D1 within the free tier.\n\n## Development\n\nPrerequisites: [bun](https://bun.com/) (plus [pnpm](https://pnpm.io/) for `packages/client-ts` and `packages/mcp-server`, and [uv](https://docs.astral.sh/uv/) for `packages/client-py`).\n\n```\nbun install\ncp .dev.vars.example .dev.vars\nbun run db:migrate && bun run db:seed\nbun run dev\n```\n\nSee [AGENTS.md](AGENTS.md) for the full check list, architecture invariants, and gotchas.\n\n## Repository layout\n\n| Path                   | What                                                             | License       |\n| ---------------------- | ---------------------------------------------------------------- | ------------- |\n| `/` (server + web app) | React Router 7 app on Cloudflare Workers                         | AGPL-3.0-only |\n| `packages/client-ts`   | TypeScript API client (npm), hand-written + spec contract tests  | Apache-2.0    |\n| `packages/client-py`   | Python API client (PyPI), hand-written + spec contract tests     | Apache-2.0    |\n| `packages/mcp-server`  | MCP server (npm), registers tools dynamically from the live spec | Apache-2.0    |\n| `skills/negirau`       | Agent Skill (SKILL.md), generated from the route manifest        | Apache-2.0    |\n\nEverything under `packages/` is held to the OpenAPI spec: both clients run spec-driven contract tests, `mcp-server` reads the live spec at startup, and `SKILL.md` is generated with a CI drift gate.\n\n## Public API\n\nRead-only, anonymous, CORS-open, based at `https://api.negirau.com/v1`.\nThe spec is served at [/v1/openapi.json](https://api.negirau.com/v1/openapi.json) and generated from the zod schemas at build time — it cannot drift from the implementation.\nThere are no bulk dumps and no ranking endpoints, on purpose: the lookup path is server-side search (`q=` on `/v1/subjects`) and bounded nearby search.\n\n## License\n\nCopyright (C) 2026 Shinsuke Mori.\n\nThe server and web app are licensed under [AGPL-3.0-only](LICENSE).\nClient packages under `packages/` are licensed under Apache-2.0 (see each package's LICENSE).\nThe \"Negirau\" name and the heart-pin logo are not covered by these licenses.\n\n## Attribution\n\n- Map tiles: [OpenFreeMap](https://openfreemap.org/) © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors\n",
  "bytes": 3388,
  "sha": "32aa18c7aafbf49fe0768a659f429c574869fae0cbc5f686c09ce90d1cba6bad",
  "repo_slug": "sincekmori/negirau",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sincekmori_negirau_4998b9d0/readme"
}