SkillKit

REST API

Runtime skill discovery via HTTP

REST API

Skills shouldn't require pre-installation. With the SkillKit REST API, any agent, framework, or tool can discover and retrieve skills on demand over HTTP.

Start the server

skillkit serve

That's it. The API is now running at http://localhost:3737.

Search for skills

curl "http://localhost:3737/search?q=react+performance"
{
  "skills": [
    {
      "name": "react-performance",
      "description": "React app performance optimization",
      "source": "anthropics/skills",
      "tags": ["react", "performance"],
      "score": 87
    }
  ],
  "total": 42,
  "query": "react performance",
  "limit": 20
}

Results are ranked by a multi-signal scoring system. The best matches come first.

With filters

Use POST for advanced filtering:

curl -X POST http://localhost:3737/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "auth",
    "filters": { "tags": ["security"], "category": "backend" }
  }'

Include full content

Add include_content=true to get the complete SKILL.md body:

curl "http://localhost:3737/search?q=pdf&include_content=true&limit=3"

Get a specific skill

curl http://localhost:3737/skills/anthropics/skills/pdf-processing

The path follows the pattern /skills/:owner/:repo/:skill-name.

curl http://localhost:3737/trending?limit=10

Returns the top skills ranked by relevance score across all sources.

List categories

curl http://localhost:3737/categories
{
  "categories": [
    { "name": "react", "count": 156 },
    { "name": "typescript", "count": 134 },
    { "name": "testing", "count": 89 }
  ],
  "total": 89
}

How ranking works

Every search result gets a score from 0 to 100, computed from four signals:

SignalPointsWhat it measures
Content40Has a description and SKILL.md body
Query match30How well the name/description matches your search
Popularity15GitHub stars + install count (log-scaled)
References15Has example files, docs, or resources

A skill with full content, an exact name match, high stars, and example files scores close to 100. A skill with just a name and no content scores around 10.

Server options

skillkit serve --port 8080 --host localhost --cors "http://localhost:3000"
OptionDefaultWhat it does
--port / -p3737Port to listen on
--host / -H0.0.0.0Host to bind to
--cors*Allowed CORS origin
--cache-ttl86400000Cache lifetime in ms (default 24h)

Rate limiting

60 requests per minute per IP. Response headers tell you where you stand:

HeaderMeaning
X-RateLimit-RemainingRequests left in this window
X-RateLimit-ResetWhen the window resets

Exceed the limit and you'll get HTTP 429 with a retryAfter field.

Caching

Search results are cached in memory using an LRU strategy. Same query, same results, no recomputation. Check cache performance:

curl http://localhost:3737/cache/stats
{
  "hits": 142,
  "misses": 38,
  "size": 45,
  "maxSize": 500,
  "hitRate": 0.789
}

Health check

curl http://localhost:3737/health
{
  "status": "ok",
  "version": "1.12.0",
  "skillCount": 15062,
  "uptime": 3600
}

Use it programmatically

import { createApp, startServer } from '@skillkit/api';

const { server, app, cache } = await startServer({
  port: 3737,
  skills: mySkillsArray,
});

Or get just the Hono app for testing:

const { app, cache } = createApp({
  skills: mySkillsArray,
  cacheTtlMs: 3_600_000,
});

Interactive docs

The server includes built-in Swagger UI at /docs and an OpenAPI 3.1 spec at /openapi.json. Open http://localhost:3737/docs in your browser to try endpoints interactively.

The hosted version is available at agenstskills.com/api.

All endpoints

MethodPathDescription
GET/search?q=...Search skills
POST/searchSearch with filters
GET/skills/:owner/:repo/:idGet specific skill
GET/trending?limit=20Trending skills
GET/categoriesSkill categories
GET/healthServer health
GET/cache/statsCache statistics
GET/docsSwagger UI
GET/openapi.jsonOpenAPI spec

On this page