Repository navigation
add keenable as a built-in integration through its mcp server - #162
Open
ilya-bogin-keenable wants to merge 3 commits into
Open
ilya-bogin-keenable wants to merge 3 commits into
ilya-bogin-keenable wants to merge 3 commits into
Conversation
Keenable is signed in to through its MCP server (api.keenable.ai/mcp-oauth, OAuth with PKCE and a client registered on the spot) or connected with an API key, sent as the bearer token, as Exa and Parallel are. Agents get Search the web and Read web pages, the results written out as Exa writes its own. Custom connections to api.keenable.ai move over as the other built-in servers' do, and one reached with nothing stays custom.
Contributor
|
Thanks for opening the PR, @ilya-bogin-keenable! We'll take a look and get back to you. |
A page Keenable found nothing at is not found, and one whose site turned its fetcher away for too many requests is out of reach for now, each with the address and what to try next, as Exa's and Parallel's are since personalagentproxy#165; one it couldn't reach is out of reach in its own words, and anything else stays in its words. As Exa is, it is asked for a little more of a page than is kept, so a page cut at 100,000 characters ends with the note saying so, and an empty page fails. Custom connections to api.keenable.ai move over on the next start through a data migration of their own, since instances have already run the one that moved the others'.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds Keenable as a built-in integration next to Exa and Parallel, built the same way: people sign in through Keenable's MCP server (
https://api.keenable.ai/mcp-oauth, OAuth with PKCE and a client registered on the spot) or paste an API key, and agents get Search the web and Read web pages.Merged with main after #167, so Keenable follows the catalog architecture: one module per integration, one connector per collection.
What changed
connections/keenable/: the server and its parsers (keenable-mcp.ts), itsBuiltInMcpdeclaration (built-in.ts) and its module (integration.ts,builtInMcpIntegrationwith the web connectors), registered inconnections/integrations.ts, with tests, mirroringparallel/. A key is checked by listing the tools with it, since Keenable turns a bad key down with a 401, and it is sent as the bearer token. Keenable says nothing of who signed in, so it isanonymouslike Exa and Parallel.records/web-connector.ts:keenableConnectors(searches and pages).KEENABLE_WEBaskssearch_web_pagesandfetch_page_contentfor JSON and writes the results out as Exa writes its own ("Title / URL / Published / Highlights" blocks between---lines), the page text fromcontent. As with Exa, it asks for a little more of a page than is kept, so a page cut at 100,000 characters ends with the "Cut short" note, and an empty page fails.not_foundand a site that rate-limited its fetcher is out of reach (429), both throughpageError; a page it couldn't reach isprovider_unreachablein Keenable's words; anything else, such as a site that denied access, stays avalidation_errorin Keenable's words.webIntegration, the id inIntegrationId, and the logo atweb/public/integrations/keenable.svg.connections/keenable.mdx(same shape asparallel.mdx, including pass on why a provider failed, in its words or with what to do next, and say when a web page was cut #165's note on cut and unreadable pages), nav, the index and the lists incustom-mcp.mdx; the comment lists of key-taking integrations in the web app;page-failure.ts's comment.api.keenable.aimove over as the other built-in servers' do; one made with a token keeps it as its key, and one reached with nothing stays custom. Since instances have already runtake-over-custom-connections, a second data migration,take-over-custom-keenable-connections, runstakeOverCustomConnectionsonce more, asdata-migrations/run.tsasks of an integration built in later. Drop it if you'd rather not.What is sent to Keenable: the query or the page address, with the connection's OAuth token or API key as the bearer token. The server address carries
?keenable_title=personal-agent-proxyso Keenable can tell which app the requests come from; the OAuthresourceis the address without it, as with Cloudflare's query.Tested
bun install --frozen-lockfile,bun run typecheck,bun run test(api 1163, web 249, integrations 49, contracts 17 and the rest pass),bun run lint(no new warnings) andbun run build.callMcpTooland the new parsers against Keenable's keyless server: a search returned 10 results in 611 ms and a page read took 265 ms; a missing page comes back asnot_found, a 429 and an unreachable site asprovider_unreachable, a site that denied access asvalidation_error;/mcp-oauthwith no credential and a made-up key both come back ascredentials_rejected.bun run devand the seeded workspace: Keenable shows in the catalog with its key and plus, a made-up key in the dialog shows "Keenable turned the key down", and Sign in with Keenable registers a client and lands on Keenable's consent page. I did not finish a sign-in or use a real key.Disclosure: I work at Keenable, which runs this search API.
Screenshot: Settings > Add connection, Keenable next to Exa and Parallel