# Developers — Jaru

Read-only API, MCP servers, NLWeb search, and an A2A agent for the 25 projects on jaru.dev. Free, no key needed.

## Quickstart

Every project on this site is available as JSON. No key, no signup:

```
curl https://jaru.dev/api/v1/projects?q=game
curl https://jaru.dev/api/v1/projects/coffee-index
```

The full contract is in [openapi.json](https://jaru.dev/openapi.json), and the [API catalog](https://jaru.dev/.well-known/api-catalog) lists every service.

## REST API

- `GET /api/v1/projects`: every project. Filter with `category`, `status`, or `hosted=true`; search with `q`.
- `GET /api/v1/projects/{slug}`: one project.
- Errors are JSON: `{ "error": { "code", "message", "hint", "docs" } }`, with codes such as `project_not_found` and `invalid_category`.

## MCP servers

Two Streamable HTTP MCP servers, no auth:

- `https://jaru.dev/mcp`: the portfolio. Tools `list_projects`, `get_project`, `search_projects`.
- `https://jaru.dev/mcp/docs`: this documentation. Tools `search_docs`, `read_doc`.

```
{ "mcpServers": { "jaru": { "url": "https://jaru.dev/mcp" } } }
```

Server metadata: [server-card.json](https://jaru.dev/.well-known/mcp/server-card.json).

## NLWeb search

Natural-language search over the projects, following Microsoft's NLWeb REST shape:

```
curl "https://jaru.dev/ask?query=browser+games"
curl -N "https://jaru.dev/ask?query=browser+games&streaming=true"
```

Matching is keyword-based, not a language model, so name the thing you want.

## A2A agent

An Agent-to-Agent endpoint answers questions about the projects over JSON-RPC (`message/send`). Its card is at [/.well-known/agent-card.json](https://jaru.dev/.well-known/agent-card.json). Like /ask, it searches by keyword; it does not run a model.

## In the browser (WebMCP)

On jaru.dev itself, browsers that support WebMCP expose the same tools to their built-in agent through `document.modelContext`, so an agent in the page can list and open projects without scraping.

## Markdown and llms.txt

- Append `.md` to any page (for example [https://jaru.dev/index.md](https://jaru.dev/index.md)), or request it with `Accept: text/markdown`.
- [llms.txt](https://jaru.dev/llms.txt) is the index; [work/llms.txt](https://jaru.dev/work/llms.txt) and [developers/llms.txt](https://jaru.dev/developers/llms.txt) are the per-section versions.
- [agents.md](https://jaru.dev/agents.md) says when an agent should use this site.

## Authentication

None. Every endpoint is public and read-only, so there are no keys, accounts, or tokens to manage.

## Limits

No quotas are enforced beyond Vercel's platform protections. Responses are cached for five minutes; please cache on your side too.

## FAQ

**Do I need an API key?**

No. Every endpoint on jaru.dev is public and read-only, so there is nothing to sign up for.

**Is there a sandbox?**

Production is the sandbox: every interface only reads, so no call can change or delete anything.

**What does it cost?**

Nothing. There are no paid plans, and the API, MCP server, and search endpoints are free to use.

**Which interface should an agent use?**

MCP if your client speaks it, the REST API for plain HTTP, NLWeb /ask for natural-language search, and the .md pages for reading.

**How fresh is the data?**

It is the same data the pages render, published with every deploy of jaru.dev.
