Skip to content

feat(plugins): add Keenable web search MCP - #9316

Open
KGKallasmaa wants to merge 4 commits into
ParadevAI:mainfrom
KGKallasmaa:feat/add-keenable-plugin
Open

KGKallasmaa wants to merge 4 commits into
ParadevAI:mainfrom
KGKallasmaa:feat/add-keenable-plugin

Conversation

@KGKallasmaa

@KGKallasmaa KGKallasmaa commented Nov 3, 2026 •

Copy link
Copy Markdown

Summary

Adds Keenable as a Paradev plugin so agents can search the web and fetch pages as clean markdown via Keenable's MCP.

Mirrors the existing Exa plugin shape (streamable-http MCP, Data & APIs category).

Changes

  • plugins/keenable/plugin.json
  • .agent-marketplace.json (register after Firecrawl)

Disclosure

I work with the Keenable team. Happy to adjust naming, OAuth/connector wiring (e.g. Firecrawl-style mcp-oauth), or icon if maintainers prefer.

Test plan

  • Plugin appears in marketplace under Data & APIs
  • Installing / enabling Keenable reaches https://api.keenable.ai/mcp
  • Agent can call search + fetch tools

Allow edits from maintainers. Will sign CLA as required.


Summary by cubic

Adds Keenable as a marketplace plugin so agents can search the web and fetch pages as clean markdown via Keenable's MCP, mirroring the existing Exa/Firecrawl plugin shape.

  • Registers plugins/keenable/plugin.json with a streamable-http MCP connection to https://api.keenable.ai/mcp, exposing search_web_pages and fetch_page_content under Data & APIs.
  • Adds the keenable_mcp connector requiring per-user Keenable API keys (bound via X-API-Key) so traffic isn't shared on the anonymous IP quota.
  • Registers the plugin in .agent-marketplace.json (version 1.0.1) and regenerates manifests.generated.ts so FIRST_PARTY_MANIFESTS includes Keenable.
  • Reformats the featured array and connector scopes, and drops the trailing newline; diff noise only, no behavior change.

Written for commit d495287. Summary will update on new commits.

View guided diff

Summary by CodeRabbit

  • New Features
    • Added the Keenable plugin to the marketplace under Data & APIs, now at version 1.0.1. It connects to Keenable’s service through its MCP endpoint using streamable HTTP and requires an API key for authentication.
    • Added a Keenable connector that uses the API key for account identification and service requests.
    • GitHub and Linear remain the featured integrations.

Add Keenable as a first-party-style Paradev plugin next to Exa/Firecrawl.
MCP: https://api.keenable.ai/mcp (search_web_pages, fetch_page_content).
Docs: https://docs.keenable.ai/mcp-server
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor


Thank you for your submission, we really appreciate it. Like many open-source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution. You can sign the CLA by just posting a Pull Request Comment same as the below format.


I have read the CLA Document and I hereby sign the CLA


1 out of 2 committers have signed the CLA.
✅ (KGKallasmaa)[https://github.com/KGKallasmaa]
❌ @karl-gustav
You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

@KGKallasmaa

Copy link
Copy Markdown
Author

I have read the CLA Document and I hereby sign the CLA

@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Walkthrough

The marketplace now lists the Keenable plugin. Its manifest defines Superset metadata and a streamable HTTP MCP endpoint. The shared connector registry adds a user-scoped API-key connector for identity lookup and bound requests.

Changes: Keenable plugin

Layer / File(s) Summary
Define the Keenable connector
packages/shared/src/connectors/connectors.json
Adds a user-scoped API-key connector. It uses X-API-Key for identity lookup and bound requests and maps organization and user fields from the identity response. Existing connector entries also receive formatting-only changes or equivalent JSON escapes.
Define and register the Keenable plugin
plugins/keenable/plugin.json, .agent-marketplace.json
Adds the plugin manifest with its Superset interface and streamable HTTP MCP endpoint. Adds the marketplace entry. The featured list formatting changes, with github and linear retained.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Feature

Possibly related PRs

  • ParadevAI/Paradev#9297: Adds the marketplace page that renders first-party entries, including the Keenable registration.

Suggested reviewers: harshithmullapudi

Merge Risk: Minimal · up to d4952

Keenable registration and API-key configuration are consistent, with no demonstrated code blocker. The reported CLA failure still needs clearing before merge.

Pre-merge checks: Passed 5
Check name Status Explanation
Title check Passed The title uses conventional commit format and clearly identifies the main change: adding the Keenable web search MCP plugin.
Description check Passed The description explains what changed, why it changed, the affected files, and the planned tests. It does not reproduce the exact template headings or provide completed test results, but it is mostly …
Docstring Coverage Passed No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description explains what changed, why it changed, the affected files, and the planned tests. It does not reproduce the exact template headings or provide completed test results, but it is mostly complete and directly related to the pull request.

Full details: Docstring Coverage

Explanation

No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 0 files. (3 skipped: 3 unsupported.)

Finishing Touches
Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.
Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9d3be814-c1eb-4f94-81aa-0c0cddeda5c5
Commits

Reviewing files that changed from the base of the PR and between 59af844 and d495287.

Files ignored due to path filters: 1
  • packages/shared/src/plugins/manifests.generated.ts is excluded by !**/*.generated.*
Files selected for processing: 3
  • .agent-marketplace.json
  • packages/shared/src/connectors/connectors.json
  • plugins/keenable/plugin.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.

github-actions Bot added a commit that referenced this pull request Nov 3, 2026
@greptile-apps

greptile-apps Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

[Low impact] The change adds one optional web-search plugin to the marketplace.

Regenerate and commit the bundled manifests before merging so users can discover and install Keenable.

Findings

  1. P1 Keenable cannot be installed ▶
Fix with agent prompt
### Issue 1
.agent-marketplace.json:241-248
Keenable is registered here but missing from `packages/shared/src/plugins/manifests.generated.ts`. The API builds its available catalog from `FIRST_PARTY_MANIFESTS`, so Keenable stays hidden, and an account install returns `Unknown plugin "keenable"`. Regenerate and commit the bundled manifests through the plugin publish flow alongside this entry.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

Adds Keenable as a web-search and page-fetch plugin.

  • Agents can connect to Keenable for web search and page fetching.
  • Marketplace formatting changes leave the featured plugins unchanged.

Reviews (1) · Last reviewed commit: "feat(plugins): add Keenable web search M..." · Reviewed by Greptile

Comment thread .agent-marketplace.json Outdated
Comment on lines +241 to +248
"name": "keenable",
"description": "Search the web and fetch pages as clean markdown with Keenable, built for AI agents.",
"author": {
"name": "Paradev"
},
"category": "data & apis",
"source": "./plugins/keenable",
"version": "1.0.0"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Keenable cannot be installed

Keenable is registered here but missing from packages/shared/src/plugins/manifests.generated.ts. The API builds its available catalog from FIRST_PARTY_MANIFESTS, so Keenable stays hidden, and an account install returns Unknown plugin "keenable". Regenerate and commit the bundled manifests through the plugin publish flow alongside this entry.

Knowledge Base Used: Connector and plugin lifecycle

Prompt To Fix With AI
This is a comment left during a code review.
Path: .agent-marketplace.json
Line: 241-248

Comment:
**Keenable cannot be installed**

Keenable is registered here but missing from `packages/shared/src/plugins/manifests.generated.ts`. The API builds its available catalog from `FIRST_PARTY_MANIFESTS`, so Keenable stays hidden, and an account install returns `Unknown plugin "keenable"`. Regenerate and commit the bundled manifests through the plugin publish flow alongside this entry.

**Knowledge Base Used:** [Connector and plugin lifecycle](https://app.greptile.com/-/switch-tenant?tenant=personal-org-6810&next=%2Fcustom-context%2Fknowledge-base%2Fparadevai%2Fparadev%2F-%2Fdocs%2Fconnector-and-plugin-lifecycle.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 2 files

Architecture diagram
sequenceDiagram
    participant M as Marketplace Registry
    participant P as Plugin Installer
    participant A as Agent Runtime
    participant K as Keenable MCP API

    Note over M,K: Keenable Web Search Plugin Architecture

    M->>M: Load .agent-marketplace.json
    M->>M: Index plugin entry "keenable" under Data & APIs
    M-->>P: Plugin metadata (name, category, source path)

    P->>P: Read plugins/keenable/plugin.json
    P->>P: Parse MCP config (streamable-http, api.keenable.ai/mcp)
    P->>A: Register tools: search_web_pages, fetch_page_content

    A->>A: Agent initiates web search request
    A->>K: JSON-RPC over streamable-http: search_web_pages(query)
    K-->>A: Search results (pages, snippets)
    A->>K: fetch_page_content(url)
    K-->>A: Clean markdown content
    A-->>A: Process results for agent answer

    Note over A,K: External boundary: Keenable manages API key/auth via MCP connection
Loading

Reply with feedback, questions, or to request a fix.

View guided diff | Re-trigger cubic

Comment thread .agent-marketplace.json Resolved
Comment thread plugins/keenable/plugin.json Resolved
Comment thread plugins/keenable/plugin.json Resolved
Regenerate packages/shared/src/plugins/manifests.generated.ts via the plugin publish flow so FIRST_PARTY_MANIFESTS includes Keenable.
@KGKallasmaa

Copy link
Copy Markdown
Author

Regenerated packages/shared/src/plugins/manifests.generated.ts through the plugin publish flow so FIRST_PARTY_MANIFESTS includes Keenable (publish keenable@1.0.0). Account install should resolve now.

KGKallasmaa and others added 2 commits November 3, 2026 15:51
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Require per-user Keenable API keys via keenable_mcp (X-API-Key bind),
so Paradev proxy traffic is not shared on the anonymous IP quota.
@KGKallasmaa

Copy link
Copy Markdown
Author

Addressed the P2 on anonymous quota: Keenable now requires a per-user API key.

  • Added keenable_mcp connector (api_key → X-API-Key)
  • Plugin binds X-API-Key: ${config.access_token} and bumps to 1.0.1
  • Regenerated manifests.generated.ts via the publish flow

Users create a key at https://app.keenable.ai/console.

Kitenite added a commit that referenced this pull request Nov 8, 2026
* chore: seed CLA signature file

* @tanxarx has signed the CLA in #8881

* @ozeitis has signed the CLA in #8888

* @shubhankiit has signed the CLA in #8894

* @chrisfentiman has signed the CLA in #8910

* @RohithReddy20 has signed the CLA in #8907

* @larcane97 has signed the CLA in #8922

* @moizghumann has signed the CLA in #8935

* @andyst-dev has signed the CLA in #7930

* @svenpeeters has signed the CLA in #8943

* @kenil-kanani has signed the CLA in #8940

* @akshatcoder-hash has signed the CLA in #8963

* @NilotpalK has signed the CLA in #8995

* @serhii-kucherenko has signed the CLA in #9000

* @tonydzi has signed the CLA in #9002

* @adaam2 has signed the CLA in #9038

* @tsavo-at-pieces has signed the CLA in #9059

* @ganeshmshetty has signed the CLA in #9130

* @aaronrosenthal has signed the CLA in #9135

* @alexnault has signed the CLA in #9138

* @kunalgoesbyken has signed the CLA in #9235

* @Joaco-gavernet has signed the CLA in #9236

* @theblondealex has signed the CLA in #8240

* @talarczykco has signed the CLA in #7274

* @throw99 has signed the CLA in #7906

* @lacherogwu has signed the CLA in #9310

* @KGKallasmaa has signed the CLA in #9316

* @Niltonsf has signed the CLA in #9331

* @Anmol1578 has signed the CLA in #9351

* @RyoKusnadi has signed the CLA in #9317

* @thedotmack has signed the CLA in #9414

* @abudker has signed the CLA in #9439

* @sanchitmonga22 has signed the CLA in #9443

* @Bruno-rose has signed the CLA in #9446

* @Ashad001 has signed the CLA in #9487

* @vivek-pothina has signed the CLA in #8359

* @colingreig has signed the CLA in #9489

* @anmol0b has signed the CLA in #9492

* @resteqs has signed the CLA in #9506

* @pgilmore has signed the CLA in #7878

* fix(desktop): name the DMG from the display name

The DMG file and its volume title now use DESKTOP_DISPLAY_NAME, so a
Paradev build ships Paradev-<version>-<arch>.dmg. Unset, names stay
Superset. The release keeps the Superset-<arch>.dmg alias beside the new
one, since the README, docs and download button link to it. The .app
bundle and the -mac.zip update files keep the Superset name.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants