From glean-pack
Implements webhook handlers for GitHub, Confluence, Notion events to index or delete documents incrementally in Glean via Indexing API.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin glean-packThis skill is limited to using the following tools:
Glean does not send webhooks. Instead, build event-driven connectors that receive webhooks from source systems (GitHub, Confluence, Notion) and push incremental updates to the Glean Indexing API.
Deploys Glean custom connectors as scheduled jobs on Cloud Run, AWS Lambda, Fly.io, or GitHub Actions for periodic indexing syncs.
Implements Notion change detection using polling, native webhooks, and third-party connectors for real-time sync, change feeds, backups, and event workflows.
Searches and fetches Glean developer docs via MCP tools for APIs, SDKs (Python/JS), MCP config, authentication, indexing, and integrations.
Share bugs, ideas, or general feedback.
Glean does not send webhooks. Instead, build event-driven connectors that receive webhooks from source systems (GitHub, Confluence, Notion) and push incremental updates to the Glean Indexing API.
// Receive GitHub wiki/page webhooks, index into Glean
app.post('/webhooks/github', async (req, res) => {
const event = req.body;
if (event.action === 'created' || event.action === 'edited') {
await glean.indexDocuments('github_wiki', [{
id: `wiki-${event.page.sha}`,
title: event.page.title,
url: event.page.html_url,
body: { mimeType: 'text/html', textContent: event.page.body },
author: { email: event.sender.email },
updatedAt: new Date().toISOString(),
permissions: { allowAnonymousAccess: true },
}]);
}
res.sendStatus(200);
});
app.post('/webhooks/confluence', async (req, res) => {
const { event, page } = req.body;
if (event === 'page_updated' || event === 'page_created') {
const content = await fetchConfluencePage(page.id);
await glean.indexDocuments('confluence_custom', [{
id: `conf-${page.id}`,
title: content.title,
url: `${CONFLUENCE_URL}/wiki/spaces/${content.space.key}/pages/${page.id}`,
body: { mimeType: 'text/html', textContent: content.body.storage.value },
updatedAt: content.version.when,
}]);
}
if (event === 'page_removed') {
await glean.deleteDocument('confluence_custom', `conf-${page.id}`);
}
res.sendStatus(200);
});