Keenable SELECT: an agent that searches the web in SQL
Keenable SELECT: Web Search via SQL
Keenable SELECT is an advanced agentic system designed to treat the entire internet as a queryable database, allowing users to perform complex web research using SQL syntax.
The system generates comprehensive research reports where every output is backed by a transparent "trajectory"—a complete log of every query executed, the resulting tool outputs, and the final data sets.
🛠️ How the Process Works
When a user submits a complex request, such as: "Which AI researchers moved between frontier labs since 2025? For each move list the researcher, the lab they left, where they went and the month," the agent doesn't just "browse"; it executes a structured query.
The Logic Flow
Example SQL Execution
The agent translates the natural language request into a specialized SQL statement:
SELECT
SEM_EXTRACT(content, 'researcher'),
SEM_EXTRACT(content, 'left lab'),
SEM_EXTRACT(content, 'joined lab'),
SEM_EXTRACT(content, 'move month')
FROM WEB_SEARCH(8 diverse queries)
WHERE SEM_MATCH(content, 'named researcher moving between frontier labs, 2025+')
In terms of computational cost, the system optimizes the process:
📚 Research Gallery
Below is a collection of reports generated by Keenable SELECT. These are not simple summaries; they are data-driven trajectories.
| Report Topic | Date | Messages | Queries | Link |
|---|---|---|---|---|
| YC Startup-Name Morphology (20 yrs) | 2026-09-01 | 36 | 18 | [Trajectory] |
| History of Search Engines (1982–2026) | 2026-08-31 | 18 | 10 | [Trajectory] |
| US Gigawatt AI Data-Center Buildout | 2026-08-31 | 20 | 10 | [Trajectory] |
| Documented Zoo Animal Escapes | 2026-08-31 | 20 | 12 | [Trajectory] |
| SE Asian Casual Restaurants (Bay Area) | 2026-08-31 | 18 | 9 | [Trajectory] |
| Copied/Inspired Bollywood Songs | 2026-08-31 | 19 | 10 | [Trajectory] |
| Death by GPS: Water/Desert Incidents | 2026-08-31 | 15 | 9 | [Trajectory] |
| Frontier AI Researcher Moves (2025+) | 2026-08-31 | 16 | 9 | [Trajectory] |
| Global Great Bird Migrations | 2026-08-31 | 17 | 10 | [Trajectory] |
| India's Famous Mango Origins Map | 2026-08-31 | 31 | 16 | [Trajectory] |
| Open-Weight LLM Timeline (2026) | 2026-08-31 | 14 | 9 | [Trajectory] |
| Marvel Screen Continuities (2005-26) | 2026-08-31 | 24 | 12 | [Trajectory] |
| Mechanical Keyboard 10-Year Timeline | 2026-08-31 | 20 | 10 | [Trajectory] |
| US Nearest Zoo Voronoi Atlas | 2026-08-31 | 29 | 16 | [Trajectory] |
| Orbital Launch Atlas (1957–2026) | 2026-08-31 | 16 | 9 | [Trajectory] |
| Popular Open-Source AI Agent Frameworks | 2026-08-31 | 17 | 9 | [Trajectory] |
| Seattle/Bellevue Coffee Tour | 2026-08-31 | 18 | 9 | [Trajectory] |
| AI Lab Founder Family Tree | 2026-08-31 | 20 | 10 | [Trajectory] |
| Great-Chef Kitchen Lineage | 2026-08-31 | 16 | 9 | [Trajectory] |
| US Specialty Coffee Roaster Atlas | 2026-08-31 | 13 | 9 | [Trajectory] |
| Common EDC Pack Contents | 2026-08-31 | 16 | 9 | [Trajectory] |
| Australia's Big Things Map/Route | 2026-08-27 | - | - | [Trajectory] |
| Bay Area First-Date Playbook | 2026-08-27 | - | - | [Trajectory] |
| Braintrust.dev Public Org Chart | 2026-08-27 | - | - | [Trajectory] |
⚙️ The Underlying System
Keenable SELECT operates as an MCP server featuring a primary tool called select.
Core Architecture
- DuckDB Integration: Executes read-only
SELECTstatements on live web data. - Hybrid Execution: Semantic operators run outside DuckDB; their results are injected back into the row set for final SQL processing.
- Efficiency: Can scan
>1,000pages and filter them viaWHEREclauses without LLM overhead. - State Management: Every result set is assigned a unique
id, allowing subsequent queries to reference previous data. - Reporting: A dedicated server model converts these rows into shareable HTML reports.
Semantic Operators Reference
| Operator | Functionality | Detail |
|---|---|---|
WEB_SEARCH('q1', ...) | Multi-query search | Merges ranked results and deduplicates URLs. |
WEB_FETCH('url', ...) | Content Retrieval | Converts target URLs into Markdown (1 row per page). |
SEM_EXTRACT(col, 'desc') | Field Extraction | One LLM call per row; returns value or null. |
SEM_EXTRACT_ALL(col, 'val') | List Extraction | Similar to SEM_EXTRACT but returns a list of all matches. |
SEM_SCORE(col, 'query') | Relevance Scoring | Provides a low-cost embedding score per row. |
SEM_NORM(col) | Normalization | Assigns identical keys to values with the same meaning. |
Note: Operators support dynamic arguments, such as WEB_SEARCH(name || ' founding year').
🤖 The Dual-Agent Framework
Every report is the result of a collaboration between two distinct agents:
1. The Research Agent
This is a standard tool-loop LLM equipped with the select tool.
- Behavior: It iteratively writes and executes queries until the research goal is met.
- Transparency: It streams all tool calls and results as real-time events.
- Continuity: Follow-up questions are handled by referencing the stored conversation transcript.
2. The Report Agent
Once data is gathered, this agent handles the presentation via the generate_html_report function.
- Environment: Operates in a sandboxed Python session.
- Data Handling: It accesses result sets as dataframes, ensuring data integrity by avoiding manual retyping by the LLM.
- Quality Control:
- Renders a draft.
- Analyzes screenshots and JavaScript error counts.
- Iteratively fixes the document within a set budget before final publication.