okfindex
Search Open Knowledge Format (OKF) bundles, read a bundle card and submit your own with IndexNow.
Should I use this
Quality & Safety
Findings (1)
- LOWin api_index
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"okfindex": {
"url": "https://okfindex.com/mcp"
}
}
}Remote endpoints
https://okfindex.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (7)
🟢api_index
Index of the OKF Index API: routes, quota (none) and how to plug the MCP.
Input Schema
{
"type": "object",
"properties": {}
}🟢search_bundles(q, origin, repo, version, language, ...)
Search the index of OKF bundles: free text over name, tagline, description and origin; filter by provenance (github|domain), repository, version, language, license, root type or concept count; search root concept text. Paginate with limit/offset. Only `live` bundles. Free text matches the name, the tagline, the description and the origin identifier (`owner/repo:path` or the bundle URL). No `total` on purpose: `GET /api/okf/stats` has it.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free text over name, tagline, description and origin identifier."
},
"origin": {
"type": "string",
"description": "Provenance: found by the GitHub sweep, or submitted by a domain.",
"enum": [
"github",
"domain"
]
},
"repo": {
"type": "string",
"description": "Only bundles of one repository, `owner/repo` (case-insensitive)."
},
"version": {
"type": "string",
"description": "Only bundles declaring one of these `okf_version` values; comma-separated, up to 5."
},
"language": {
"type": "string",
"description": "Only bundles whose repository language is one of these; comma-separated, up to 5 (GitHub bundles)."
},
"concept": {
"type": "string",
"description": "Text in the indexed root content, including listed concept names and summaries (first 1000 characters); up to 80 characters."
},
"concepts": {
"type": "string",
"description": "Number of entries listed by the root. Up to 5 comma-separated bands: 0,1-5,6-20,21-100,101+."
},
"type": {
"type": "string",
"description": "Type declared by the root, not the types of every concept. Up to 5 comma-separated values, 40 characters each."
},
"license": {
"type": "string",
"description": "Repository license. Up to 5 comma-separated values, 40 characters each."
},
"sort": {
"type": "string",
"description": "Result order: arrival, last content change, name or repository stars.",
"enum": [
"recent",
"updated",
"name",
"stars"
],
"default": "recent"
},
"limit": {
"type": "integer",
"description": "Bundles per page, at most 100.",
"default": 24
},
"offset": {
"type": "integer",
"description": "How many bundles to skip. Use `next_offset` from the previous response; the list ends at 1000.",
"default": 0
}
}
}🟢get_bundle(id)
One bundle's card: root index.md URL, version, concept count, provenance and repository signal. `live` and `low` (example or fixture bundles kept out of the search) both answer here.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Bundle id, the `id` of every item in the list."
}
},
"required": [
"id"
]
}🟢index_stats
Size of the index by provenance and when it last changed.
Input Schema
{
"type": "object",
"properties": {}
}🟡submit_bundles(urlList, host, key, keyLocation)
Queue bundle root URLs served by a host you own. IndexNow rules: the key file at https://<host>/<key>.txt has to match, the answer is 202, and nothing of yours is read before the collector checks that file. No account, no payment: ownership is proved by a key file on the host, exactly as IndexNow does it. Host `https://<host>/<key>.txt` containing the key (or point `keyLocation` at another path on the SAME host), then send the bundle URLs. We answer **202**: the key has not been checked yet. Verification and reading happen on our collector, never at the edge — so nothing is published, and no URL of yours is fetched, before the key matches. Re-sending a URL is how you say the bundle changed; it goes back in line to be re-read. At most 100 URLs per request and 200 per host per UTC day. Bundles in public GitHub repositories need no ping: the sweep finds them.
Input Schema
{
"type": "object",
"properties": {
"urlList": {
"type": "array",
"items": {
"type": "string"
},
"description": "The bundle roots (`index.md` files): https, on `host`, ending in .md — any path, since the spec fixes none."
},
"host": {
"type": "string",
"description": "The domain that serves the bundles and the key file."
},
"key": {
"type": "string",
"description": "The IndexNow key: 8 to 128 characters of [a-zA-Z0-9-]."
},
"keyLocation": {
"type": "string",
"description": "Alternative location of the key file, on the SAME host. Default: `https://<host>/<key>.txt`."
}
},
"required": [
"host",
"key",
"urlList"
]
}🟢pricing
Current public prices and free allowances; no charge.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢billing
Payment discovery and billing summary; does not create a charge.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}Community
Evidence