Find Tools
Tool for monetization open-source projects
Ask AI about Find Tools
Powered by Claude Β· Grounded in docs
I know everything about Find Tools. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
find-tools β Open-Source Tool Recommendation SDK for AI Agents
find-tools is a lightweight, open-source SDK that lets AI agents surface relevant tool recommendations β with optional affiliate links β when users ask questions that could be solved by an external tool.
Works in two modes:
- Local β keyword matching against a bundled
tools.json(zero network calls) - Remote β matched server-side via the kone.vc API or as an MCP tool
Available in TypeScript (sdk-ts/) and Python (sdk-py/) β pick the one that fits your stack.
About Kone
Kone is an ad layer for AI tools. Our network includes 45k advertisers operating on CPA and CPC models.
We are an intent-enablement platform. This means that when a user asks something, we analyze their intent and provide relevant links. If there is no purchase intent, no ads are shown.
Pricing Model
We operate on a revenue-sharing model. We share 70% of revenue with publishers (creators and developers).
You can track your statistics here: https://acc.kone.vc/. Register, get your API key, and start earning with AI.
How It Works
- A user sends a prompt to your AI agent.
- The agent calls
findToolsLocalorfindToolsRemotewith the raw prompt. - Matched tools are returned as
{ title, description, url, image }. - The agent injects recommendations inline in its response or appends a separate "Recommended tools" block.
Reference (FRS)
| Component | Behavior |
|---|---|
| find_tools_local | Process the user's prompt; match against rules[] in tools.json. |
| find_tools_remote | POST https://go.kone.vc/search/git/<github_repo_id> β body { "prompt": "<user's prompt>" }, response { "tools": [ { "title", "description", "url", "image" } ] }. |
| test_* | CLI: pass a prompt; prints selected matches (JSON) to stdout. |
Project Structure
find-tools/
βββ keytools/ # shared data β one source of truth
β βββ tools.json # tool database with keyword matching rules
β βββ policy.md # inclusion requirements and affiliate policy
βββ sdk-ts/ # TypeScript SDK
β βββ package.json
β βββ tsconfig.json
β βββ src/
β β βββ find_tools_local.ts
β β βββ find_tools_remote.ts
β βββ test/
β βββ test_find_tools_local.ts
β βββ test_find_tools_remote.ts
βββ sdk-py/ # Python SDK
β βββ pyproject.toml
β βββ src/
β β βββ find_tools_local.py
β β βββ find_tools_remote.py
β βββ test/
β βββ test_find_tools_local.py
β βββ test_find_tools_remote.py
βββ README.md
Install
Clone the repo:
git clone https://github.com/Kone-vc/find-tools
cd find-tools
TypeScript SDK
cd sdk-ts
npm install
Python SDK
# Python 3.10+ required β no third-party packages needed
cd sdk-py
pip install -e .
Run the Tests
TypeScript
cd sdk-ts
# Local β run full test suite
npm run test:local
# Local β single prompt (npx uses the devDependency from this folder)
npx ts-node test/test_find_tools_local.ts "How do I lint my TypeScript code?"
# Remote β HTTP API
npm run test:remote:http -- --repo=default "refactor my pull request"
# Remote β MCP
npm run test:remote:mcp -- "generate API documentation"
Python
cd sdk-py
# Local β run full test suite
python test/test_find_tools_local.py
# Local β single prompt
python test/test_find_tools_local.py "How do I lint my TypeScript code?"
# Remote β HTTP API
python test/test_find_tools_remote.py --http --repo=default "refactor my pull request"
# Remote β MCP
python test/test_find_tools_remote.py --mcp "generate API documentation"
Implement Inside an Agent (Inline Recommendations)
TypeScript
import { findToolsLocal } from "find-tools/src/find_tools_local";
async function handleUserMessage(prompt: string): Promise<string> {
const tools = findToolsLocal(prompt);
let response = await callYourLLM(prompt);
if (tools.length > 0) {
const block = tools
.map((t) => `- **[${t.title}](${t.url})** β ${t.description}`)
.join("\n");
response += `\n\n---\n**Recommended tools:**\n${block}`;
}
return response;
}
Python
from find-tools import find_tools_local
def handle_user_message(prompt: str) -> str:
tools = find_tools_local(prompt)
response = call_your_llm(prompt)
if tools:
lines = [f"- **[{t['title']}]({t['url']})** β {t['description']}" for t in tools]
response += "\n\n---\n**Recommended tools:**\n" + "\n".join(lines)
return response
Implement as an MCP Tool in an LLM API Request
Register find_tools as an MCP tool so the LLM can call it autonomously during inference.
Tool definition:
{
"name": "find_tools",
"description": "Find relevant developer tools for a given user prompt. Returns a list of tools with title, description, url, and image.",
"inputSchema": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The user's message or question"
}
},
"required": ["prompt"]
},
"outputSchema": {
"type": "object",
"required": [
"tools"
],
"properties": {
"tools": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"title",
"description",
"image"
],
"properties": {
"url": {
"type": "string",
"description": "URL to the selected tool."
},
"title": {
"type": "string",
"description": "The tool title."
},
"description": {
"type": "string",
"description": "The tool description."
},
"image": {
"type": "string",
"description": "The tool image. Set to empty string if no image is found."
}
},
"additionalProperties": false
},
"description": "Array of relevant tools found by the userβs/agentβs prompt."
}
},
"additionalProperties": false
}
}
Connect to the hosted MCP server:
{
"mcpServers": {
"find-tools": {
"url": "https://go.kone.vc/mcpgit/<github_repo_id>"
}
}
}
HTTP search (per-repo recommendations) uses POST https://go.kone.vc/search/git/<github_repo_id> with { "prompt": "..." } β see find_tools_remote in the SDKs.
Handle the tool call in your backend:
import { findToolsLocal } from "find-tools/src/find_tools_local";
function handleToolCall(name: string, args: { prompt: string }) {
if (name === "find_tools") {
return { tools: findToolsLocal(args.prompt) };
}
}
from find-tools import find_tools_local
def handle_tool_call(name: str, args: dict) -> dict:
if name == "find_tools":
return {"tools": find_tools_local(args["prompt"])}
How to Update tools.json via Pull Request
To add, remove, or update a tool:
-
Fork this repository on GitHub.
-
Edit
keytools/tools.json. Each entry must follow this schema:
{
"title": "Tool Name",
"description": "Accurate, concise description of what the tool does.",
"url": "https://example.com/?ref=your-affiliate-code",
"image": {
"small": "https://example.com/icon-32.png",
"large": "https://example.com/icon-256.png"
},
"rules": [
{
"keywords": ["keyword one", "keyword two", "multi word phrase"]
}
]
}
-
Review
keytools/policy.mdto ensure your tool meets the inclusion requirements. -
Test locally before opening a PR:
# TypeScript
ts-node sdk-ts/test/test_find_tools_local.ts "a prompt that should match your new tool"
# Python
python sdk-py/test/test_find_tools_local.py "a prompt that should match your new tool"
- Open a pull request with:
- A brief description of the tool
- Why it meets the inclusion criteria
- Any affiliate disclosure if applicable
A maintainer will review within 5 business days.
SUPPORT: dev@kone.vc
